2011-06-18 12 views
1

私はクラス階層を持っていますが、単一表の継承はありません。ActiveRecordモデルの継承と多型

ThrowAway < ActiveRecord::Base

Junk < ThrowAway

問題は、すべてのThrowAwayのオブジェクトがLocationへの参照を持っているということです。 Location

belongs_to :throw_away, :polymprohic => true

問題は、私は

ThrowAway < ActiveRecord::Base 
    has_many :locations, :as => :throw_away 
end 

を定義する場合迷惑はそれを継承し、別のテーブル名を定義した場合でも、その後、throw_away_type列は常にThrowAwayどこに設定されることです実際にはJunkに設定します。私はそれらすべてが、個々のクラスの位置関係を定義せずにLocationを持ちたいStuff < ThrowAwayRags < ThrowAwayなどが存在しますので、

は今、これらのサブクラスの多くがあるでしょう。

これはレールで可能ですか?問題は、ちょうど場所がないことです、これらの種類の関係が他にあり、私はむしろここでいくつかのDRYに従うでしょう。私は、現在のオブジェクトで実行され、実行時にこれらのリレーションシップジェネレータを生成するジェネレータメソッドを作成する必要があると仮定しています。

ありがとうございました。

答えて

1

ActiveRecordは、STIではないモデル継承と連携できないようです。幸いにも、それはおそらくあなたが本当にとにかく望むものではないでしょう。代わりにミックスインが必要なのかもしれません。

モデルを共通に共有するすべての機能を含むモジュールを作成し、すべてのモデルにそのモジュールが含まれるようにします。私はおそらくあなたのモデルのディレクトリにモジュールを置くだろうが、それは名前として形容詞を与える。一部の人は、モジュールをlibディレクトリに置くか、modelsディレクトリ内にlibディレクトリを作成するかもしれません。

あなたの場合、モジュールが混在しているときに関連付けを定義する必要があるので、コールバックを使用する必要があります。何かのように..

module Trashable 
    def self.included(base) 
    base.send :has_many, :locations, :as => :throw_away 
    end 
end