跳至内容 跳至搜索

单表继承

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)

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