单表继承¶ ↑
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 重新加载正确的类型。
请注意,所有情况下的所有属性都保存在同一张表中。阅读更多
命名空间
方法
实例公共方法
initialize_dup(other) 链接
来源: 显示 | 在 GitHub 上
# File activerecord/lib/active_record/inheritance.rb, line 343 def initialize_dup(other) super ensure_proper_type end