如何在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。