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