2017-03-31 87 views
2

用户可以有很多问题。许多用户可以参与一个问题,并为同一问题提供多个答案。用户和问题之间的关系似乎工作正常。问题与答案。有两个父级别的activerecord模型

模型/ 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是空的,除非我指定。我期望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的答案,question_id

感谢

+0

不应答属于用户。如果我要回答这个问题,答案将属于我。 – engineersmnky

+0

是的,它需要下到用户,但通过一个问题。我想要做的是user.questions.find(1).answers,这将返回此特定用户完成的问题的答案。 – Seoman

回答

0

我认为你应该在控制器使用belongs_to:user:question(而不是has_one),并设置用户手动到你的答案来自current_user

+0

现在我有以下错误:MethodError:未定义的方法'问题'为#<答案:0x00000002e7c280>在原始问题中使用命令创建新答案时。 – Seoman

相关问题