单表继承
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")
时,此记录将以 type = “Firm” 保存到 companies 表中。然后,你可以使用 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 341 def initialize_dup(other) super ensure_proper_type end