单表继承
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