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

and*_*wan 38 database inheritance activerecord model ruby-on-rails

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

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

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

Tob*_*ede 66

Rails支持单表继承.

来自AR文档:

Active Record允许通过将类的名称存储在默认名为"type"的列中来继承(可以通过覆盖Base.inheritance_column来更改).这意味着继承看起来像这样:

class Company < ActiveRecord::Base; end   
class Firm < Company; end  
class Client < Company; end   
class PriorityClient < Client; end
Run Code Online (Sandbox Code Playgroud)

当您执行Firm.create(:name =>"37signals")时,此记录将保存在公司表中,类型为""Firm".然后,您可以使用Company.find(:first,"name ='37signals'")再次获取此行,它将返回一个Firm对象.

如果您没有在表中定义类型列,则不会触发单表继承.在这种情况下,它将像普通的子类一样工作,没有特殊的魔力区分它们或用find重新加载正确的类型.

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


Pre*_*ids 16

楷模:

class Animal < ActiveRecord::Base; end
class Dog < Animal; end
class Cat < Animal; end
Run Code Online (Sandbox Code Playgroud)

移民:

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
Run Code Online (Sandbox Code Playgroud)


eld*_*rge 7

ActiveRecord支持将继承层次结构映射到单个表(单表继承.表将有一个type存储实际类名称的列,用于选择其他特定于类的列.

它可以实现多表继承映射,如图所示这里,但这种特别的方式是不可移植的,据我所知.