如何在Ruby on Rails中实现Active Recordinheritance?

如何实现与活动logging的inheritance?

例如,我想要一个类动物,一类狗,一类猫。

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

Rails支持单表inheritance。

从AR文档 :

Active Record允许通过将类的名称存储在默认名为“type”(可通过​​覆盖Base.inheritance_column进行更改)的列中进行inheritance。 这意味着inheritance看起来像这样:

class Company < ActiveRecord::Base; end class Firm < Company; end class Client < Company; end class PriorityClient < Client; end 

当您执行Firm.create(:name =>“37signals”)时,此logging将被保存在types为“Firm”的公司表中。 然后你可以再次使用Company.find(:first,“name ='37signals'”)获取这一行,它将返回一个Firm对象。

如果您的表中没有定义types列,则不会触发单表inheritance。 在这种情况下,它可以像正常的子类一样工作,不需要特殊的魔法来区分它们,或者使用find来重载正确的types。

一个很好的教程在这里: http : //juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/

楷模:

 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 

ActiveRecord支持将inheritance层次结构映射到单个表( Single-table inheritance) ,表有一个存储实际类名称的列type ,用于select其他类特定的列。

如这里所示,可以实现多表inheritance映射,但是这种特殊的方式是不可移植的,AFAIK。