跳至内容 跳至搜索

单表继承

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 重新加载正确的类型。

请注意,所有情况下的所有属性都保存在同一张表中。阅读更多

命名空间
方法
I

实例公共方法

initialize_dup(other)

# File activerecord/lib/active_record/inheritance.rb, line 341
def initialize_dup(other)
  super
  ensure_proper_type
end