2011-01-19 12 views
0

私は2種類のクラスを持っています。そのうちの1つは他の種類に属し、もう1つは多態的に他の種類に属します。双方向のbelongs_to(1つのポリモフィック)

class Term < ActiveRecord::Base 
    belongs_to :reference, :polymorphic => true 
end 

class Course < ActiveRecord::Base 
    belongs_to :term 
end 

class Career < ActiveRecord::Base 
    belongs_to :term 
end 

私は両方向で高速アクセスが必要なので、関係はbelongs_toです。私はhas_oneの関係がより遅い印象を受けています。なぜなら、一致するものを検索するために反対のテーブルをクエリする必要があるからです。_id。私はもちろんcを作成するときに

は今のところ、私は用語tようc.term = tt.reference = cを作成after_save方法を実行します。これは一種のハックだと思われますが...この関係が存在し、c.term = tを設定すると自動的にt.reference = cになるはずです。

多形性の関連付けでは、:as属性(APIを参照)を指定できますが、これはbelongs_toでは機能しないようです。

class Asset < ActiveRecord::Base 
    belongs_to :attachable, :polymorphic => true 

    def attachable_type=(sType) 
     super(sType.to_s.classify.constantize.base_class.to_s) 
    end 
    end 

    class Post < ActiveRecord::Base 
    # because we store "Post" in attachable_type now :dependent => :destroy will work 
    has_many :assets, :as => :attachable, :dependent => :destroy 
    end 

答えて

1

ええ、あなたは実際に双方向belongs_toの関連付けを行うつもりはありません。したがって、あなたは多形性(それは本当に単語ですか?)を方程式に追加すると、それは中断されます。

リレーションシップはbelongs_toです。両方向で高速アクセスが必要なためです。私は、一致する_idを検索するために反対のテーブルをクエリする必要があるため、has_one関係が遅くなるという印象を受けています。

私はあなたがこれをしたいと思っていません。速度に本当に関心がある場合は、belongs_toという表のforeign_key列を単純にインデックスできます。速度差はごくわずかです。

+0

ええ、大丈夫です。インデックスを追加し、双​​方向の 'belongs_to'関連付けをワイプします。ありがとう。 – unsorted

+1

*多型;) – candrews