Spec-Zone.ru › Ruby on Rails 7.0

модуль ActiveRecord::Inheritance

Единотабличная наследование

Active Record позволяет реализовать наследование, сохраняя имя класса в столбце, который по умолчанию называется «type» (может быть изменён путём переопределения Base.inheritance_column). Это означает, что наследование, выглядящее так:

class Company < ActiveRecord::Base; end
class Firm < Company; end
class Client < Company; end
class PriorityClient < Client; end

Когда вы Firm.create(name: "37signals"), эта запись будет сохранена в таблице companies со значением type = «Firm». После этого вы сможете снова получить эту строку, используя Company.where(name: '37signals').first, и она вернёт объект Firm.

Обратите внимание, что так как столбец type является атрибутом записи, каждый новый подкласс сразу же помечается как изменённый, и столбец type будет включён в список изменённых атрибутов записи. Это отличается от классов без единотабличного наследования (STI):

Company.new.changed? # => false
Firm.new.changed?    # => true
Firm.new.changes     # => {"type"=>["","Firm"]}

Если в вашей таблице не определён столбец type, единотабличное наследование не будет активировано. В этом случае всё будет работать как с обычными подклассами без специальной магии для различения между ними или перезагрузки правильного типа с помощью find.

Обратите внимание, что все атрибуты во всех случаях хранятся в одной и той же таблице. Подробнее: www.martinfowler.com/eaaCatalog/singleTableInheritance.html

Публичные методы экземпляров

initialize_dup(other) Показать исходный код
# File activerecord/lib/active_record/inheritance.rb, line 327
def initialize_dup(other)
  super
  ensure_proper_type
end
Вызывает метод суперкласса

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API