2011-12-03 6 views
2

私は概念的に苦労している状況があります。私には、メディアの一部を表す(意外にも)クラスMediaがあります。現在、Mediaを所有するいくつかの異なるクラスがあります。たとえば、QuestionMediaオブジェクトを所有できます。AnswerMediaオブジェクトも所有できます。belongs_toクラスのセット

これを所有クラスの方向からモデル化しようとするのは簡単ですが、私はそれらに適切なhas_oneまたはhas_manyの関連付けを行います。しかし、私は他の方向に苦労しています。メディアは特定のクラスbelong_toではなく、クラスのセットのいずれかに属することができます。

私は、あいまいさの瞬間に行うべき適切なことは、単にbelongs_toの関連付けを持つクラスに注釈を付けることではないと考えます。しかし、私はこれを確認する文書を見つけることができません。

答えて

2

あなたが探しているのは、多形性の関係です。

class Media < ActiveRecord::Base 
    belongs_to :mediable, :polymorphic => true 
end 

class Question < ActiveRecord::Base 
    has_many :media, :as => :mediable 
end 

class Answer < ActiveRecord::Base 
    has_many :media, :as => :mediable 
end 

私は同じメディアが複数のモデルに属する可能性があるという同様の質問に答えました。その答えが役に立つかもしれません。 https://stackoverflow.com/a/8237597/367611

1

あなたがやっていることは、教科書多型関連です。ガイドは彼らに良いビットを持っています。

http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

アソシエーションにわずかに、より高度なねじれは、多型の関連付けです。ポリモーフィックな関連付けでは、モデルは複数の他のモデルに1つの関連で属している可能性があります。たとえば、従業員モデルまたは製品モデルのいずれかに属する画像モデルがあるとします。

+0

偉大な答えはなく、インライン化の例では、私が思う、次のGoogle社員のために、それが容易になり、両方。 – idbentley

1

何が本当にこれをやってからあなたを妨げるものはないことに注意すべきである:

class Media < ActiveRecord::Base 
    belongs_to :question 
    belongs_to :answer 
end 

しかし、このアプローチの最大の欠点は、あなたのメディアのテーブルに使用すると、2つのNULL可能外部キー列を持っていなければならないということです - question_idおよびanswer_id

メディアを別のクラスにアタッチする場合は、もう1つのNULL可能な外部キー列をメディア表に追加する必要があります。

この問題を解決するために、Railsは多様な関連付けを使用しています。それらを使用すると、メディアは他の多くのモデルに属することができます。

だから今、あなたの質問に@Seanヒルの答えのようにあなたの関連をモデル化することができます:mediable_id(いくつかの整数)とmediable_type

class Media < ActiveRecord::Base 
    belongs_to :mediable, :polymorphic => true 
end 

class Question < ActiveRecord::Base 
    has_many :media, :as => :mediable 
end 

# etc. 

あなたのメディアテーブルには、列のちょうど1組とポリモーフィックな関連を表すことになり(「質問」または「回答」)。

はあなたにも、関連する移行に列を追加する必要があることを忘れないでください(CreateMediaマイグレーション - 必要に応じて調整する):

t.integer :mediable_id 
t.string :mediable_type 

あるいは、より簡単に、ただ一つの列で:

t.references :mediable, :polymorphic => true 
関連する問題