如何在Ruby on Rails中实现Active Record继承?

时间:2009-10-21 05:50:22

标签: ruby-on-rails database inheritance activerecord model

如何使用活动记录实现继承?

例如,我想要一个类Animal,类Dog和类Cat。

模型和数据库表映射如何?

3 个答案:

答案 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。