модуль 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
Публичные методы экземпляра
# File activerecord/lib/active_record/inheritance.rb, line 223 def initialize_dup(other) super ensure_proper_type end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.