web-dev-qa-db-ja.com

Ruby on Rails)でアクティブレコードの継承を実装する方法

アクティブなレコードで継承を実装する方法は?

たとえば、Animalクラス、Dogクラス、Catクラスが必要です。

モデルとデータベーステーブルのマッピングはどのようになりますか?

38
andrisetiawan

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 => "37signals")を実行すると、このレコードはtype = "Firm"の会社テーブルに保存されます。その後、Company.find(:first、 "name = ‘37signals’")を使用してこの行を再度フェッチすると、Firmオブジェクトが返されます。

テーブルにタイプ列が定義されていない場合、単一テーブルの継承はトリガーされません。その場合、それは通常のサブクラスと同じように機能し、それらを区別したり、findを使用して正しい型を再ロードしたりする特別な魔法はありません。

かなり良いチュートリアルがここにあります: http://juixe.com/techknow/index.php/2006/06/03/Rails-single-table-inheritance/

66
Toby Hede

モデル:

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
16

ActiveRecordは、継承階層の単一テーブルへのマッピングをサポートします( 単一テーブル継承 。テーブルには、実際のクラスの名前を格納し、他のクラス固有の列を選択するために使用される列typeがあります。

here のように、複数テーブルの継承マッピングを実装することは可能ですが、この特定の方法は移植可能ではありません。

7
elder_george