2017-03-31 5 views
2

ユーザーは多くの質問をすることができます。多くのユーザーが質問に参加して、同じ質問に複数回答することができます。ユーザーと質問の関係は正常に動作しているようです。問題は答えにあります。アクティブなレコードモデル(親レベルは2つ)

モデル/ user.rb

has_and_belongs_to_many :questions 
    has_many :answers 

モデル/ question.rb

has_and_belongs_to_many :users 
    has_many :answers 

モデル/ answer.rb

has_one :question 
    has_one :user, :through => :question 

彼私はコンソールで何をしようとしているのですか?

irb(main):022:0> u1.questions.first.answers.create(answer: "foo1", order:1) 
    (0.2ms) BEGIN 
    Answer Exists (0.5ms) SELECT 1 AS one FROM "answers" WHERE "answers"."answer" = $1 LIMIT $2 [["answer", "foo1"], ["LIMIT", 1]] 
    SQL (0.4ms) INSERT INTO "answers" ("created_at", "updated_at", "answer", "order", "question_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["created_at", 2017-03-31 19:31:04 UTC], ["updated_at", 2017-03-31 19:31:04 UTC], ["answer", "foo1"], ["order", 1], ["question_id", 1]] 
    (13.5ms) COMMIT 
=> #<Answer id: 6, created_at: "2017-03-31 19:31:04", updated_at: "2017-03-31 19:31:04", answer: "foo1", order: 1, user_id: nil, question_id: 1> 
irb(main):023:0> u1.questions.first.answers.create(answer: "bar1", order:2) 
    (0.4ms) BEGIN 
    Answer Exists (0.9ms) SELECT 1 AS one FROM "answers" WHERE "answers"."answer" = $1 LIMIT $2 [["answer", "bar1"], ["LIMIT", 1]] 
    SQL (0.5ms) INSERT INTO "answers" ("created_at", "updated_at", "answer", "order", "question_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["created_at", 2017-03-31 19:31:04 UTC], ["updated_at", 2017-03-31 19:31:04 UTC], ["answer", "bar1"], ["order", 2], ["question_id", 1]] 
    (19.9ms) COMMIT 
=> #<Answer id: 7, created_at: "2017-03-31 19:31:04", updated_at: "2017-03-31 19:31:04", answer: "bar1", order: 2, user_id: nil, question_id: 1> 
irb(main):024:0> u2.questions.first.answers.create(answer: "foo2", order:1) 
    (0.7ms) BEGIN 
    Answer Exists (0.6ms) SELECT 1 AS one FROM "answers" WHERE "answers"."answer" = $1 LIMIT $2 [["answer", "foo2"], ["LIMIT", 1]] 
    SQL (0.9ms) INSERT INTO "answers" ("created_at", "updated_at", "answer", "order", "question_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["created_at", 2017-03-31 19:31:04 UTC], ["updated_at", 2017-03-31 19:31:04 UTC], ["answer", "foo2"], ["order", 1], ["question_id", 1]] 
    (16.7ms) COMMIT 
=> #<Answer id: 8, created_at: "2017-03-31 19:31:04", updated_at: "2017-03-31 19:31:04", answer: "foo2", order: 1, user_id: nil, question_id: 1> 
irb(main):025:0> u2.questions.first.answers.create(answer: "bar2", order:2) 
    (0.5ms) BEGIN 
    Answer Exists (0.6ms) SELECT 1 AS one FROM "answers" WHERE "answers"."answer" = $1 LIMIT $2 [["answer", "bar2"], ["LIMIT", 1]] 
    SQL (0.5ms) INSERT INTO "answers" ("created_at", "updated_at", "answer", "order", "question_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["created_at", 2017-03-31 19:31:05 UTC], ["updated_at", 2017-03-31 19:31:05 UTC], ["answer", "bar2"], ["order", 2], ["question_id", 1]] 
    (14.9ms) COMMIT 
=> #<Answer id: 9, created_at: "2017-03-31 19:31:05", updated_at: "2017-03-31 19:31:05", answer: "bar2", order: 2, user_id: nil, question_id: 1> 

私が指定しない限り、user_idがnullの場合は何か間違っていることは明らかです。私はuser_idが、私がユーザーオブジェクトから質問を通してそれを作成しているという事実を仮定して、入力されると思います。

irb(main):027:0* u1.questions.first.answers.count 
    (0.7ms) SELECT COUNT(*) FROM "answers" WHERE "answers"."question_id" = $1 [["question_id", 1]] 
=> 4 

ここからわかるように、question_idでフィルタリングします。 question_idとuser_idから回答を取得する予定です

この問題は修正できますか?私はちょうど別の方法でそれをしなければならないのですか?要約として

おかげ

UPDATE

、これは私が達成したいものです:

クエリがどのように見える
User.first.answers.where(question_id: 1) 

:私は

SELECT "answers".* FROM "answers" WHERE "answers"."user_id" = $1 AND "answers"."question_id" = $2 [["user_id", 1], ["question_id", 1]] 

できるようにしたい:

User.first.questions.first.answers 

とuser_idのための答えを得ると私は、コントローラ内current_userからあなたが(代わりにhas_oneの):user:questionためbelongs_toを使うべきだと思うし、あなたの答えに、手動でユーザーを設定し

おかげ

+0

答えはユーザーに属さないようにしてください。私がこの質問に答えるならば、答えは私のものだろう。 – engineersmnky

+0

はい、それはユーザーに行く必要がありますが、質問を通して。私が望むのは、user.questions.find(1).answersを実行することです。これは、この特定のユーザーによって行われたこの質問に対する回答を返します。 – Seoman

答えて

0

をquestion_id 。

+0

次のエラーが発生しました:MethodError:元の質問のコマンドで新しい回答を作成するときに、#<回答:0x00000002e7c280>のための未定義のメソッド 'question '。 – Seoman

関連する問題