如何使用活动记录实现继承?
例如,我想要一个类Animal,类Dog和类Cat。
模型和数据库表映射如何?
答案 0 :(得分:66)
Rails支持单表继承。
来自AR docs:
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 =&gt; “37signals”),这个纪录将是 保存在公司表中的类型 =“坚定”。然后,您可以使用Company.find(:first,“name”再次获取此行 ='37signals'“)它将返回一个Firm对象。
如果您没有类型列 在您的表中定义,单表 继承不会被触发。在 那种情况下,它会像平常一样工作 没有特殊魔力的子类 区分他们或 用find重新加载正确的类型。
这里有一个非常好的教程:http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/
答案 1 :(得分:16)
型号:
class Animal < ActiveRecord::Base; end
class Dog < Animal; end
class Cat < Animal; end
迁移:
class CreateAnimals < ActiveRecord::Migration
def self.up
create_table :animals do |t|
# Other attributes...
t.string :type
end
end
def self.down
drop_table :animals
end
end
答案 2 :(得分:7)
ActiveRecord支持将继承层次结构映射到单个表(Single-table inheritance。表将有一个列type
,它存储实际类的名称,用于选择其他特定于类的列。
可以实现多表继承映射,如here所示,但这种特殊方式不可移植,AFAIK。