2016-05-24 4 views
1

私は3つのモデルを持っています。Rails:circular 3つのテーブルの多対多関係

  • ユーザー(多くの質問を投稿することができます)
  • 質問(多くの回答を持つことができます)
  • 回答(ユーザーが多くの回答を投稿することができます)

今、私が作成することができます関連といった:

class User < ActiveRecord::Base 
    has_many :questions 
    has_many :answers 
end 

class Question < ActiveRecord::Base 
    belongs_to :user 
    has_many :answers 
end 

class Answer < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :question 
end 
私はそれを行う場合は210

は今、特定の質問のクエリに対して任意のユーザの答えを見つけるために次のようになります。

@answers = User.find(params[:id]).answers.where(:question_id => params[:question_id]) 

は、任意のより良い解決策はありますか?アソシエーションを変更する必要がありますか、それは方法ですか?

+0

ユーザーは、常に自分の回答を書いているのでしょうか?質問を作成するためのユーザーインターフェイスが必要ですか? – max

+0

@max、はいユーザーは質問を作成/更新するためのインターフェイスを持っています。また、彼らは自分の質問に答えることができます。 – Emu

+1

あなたのソリューションは私にとって最適です。あなたはそれについて心配していますか? –

答えて

0

あなたはそれらの関係はちょうどよりもCRUDインターフェイスからの質問やプリセットの答えとアンケートを作成できるようにするには、ユーザーが必要な場合それを切るつもりはない。最も一般的な回答のように、メトリックを生成したい場合はあまり最適ではありません。

代わりに答え、「プリセット」との質問に答える者に提出し、応答のために別々のテーブルを使用することを検討してください。

class User < ActiveRecord::Base 
    has_many :questions 
    has_many :replies 
    has_many :selected_answers, through: :replies, 
           source: :answer 
    has_many :answered_questions, through: :replies, 
           source: :question 
end 

class Question < ActiveRecord::Base 
    belongs_to :user 
    has_many :answers 
    has_many :replies, through: :answers 
end 

# this is a "preset" 
class Answer < ActiveRecord::Base 
    belongs_to :question 
    has_many :replies 
end 

# this is the answer checked by a user 
class Reply < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :answer 
    has_one :question, through: :answer 
end 
1

はい、あなたは答えに、ユーザの外部キーを持っているので、あなたは簡単に行うことができます。

@answers = Answer.where(user_id: params[:id], question_id: params[:question_id]) 
+0

はい、これは方法です。しかし、これはシナリオにとって最高の解決策ですか? (+1) – Emu

+0

"ベストソリューション"は主観的であり、証明するのは難しいですが、指定されたモデル関係ではこれより簡単なものを考え出すのは難しいです。これは2つのパラメータ結果。あなたの質問の例はうまくいくが、より複雑であり、不必要な結合を伴う。 –