【问题标题】:activerecord model with 2 parent levels具有 2 个父级别的 activerecord 模型
【发布时间】:2017-08-26 04:24:22
【问题描述】:

一个用户可以有很多问题。许多用户可以参与一个问题并为同一个问题提供多个答案。用户和问题之间的关系似乎运行良好。问题在于答案。

model/user.rb

  has_and_belongs_to_many :questions
  has_many :answers

model/question.rb

  has_and_belongs_to_many :users
  has_many :answers

model/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 中检索答案

这个问题可以解决吗?我应该换一种方式吗?

谢谢

更新

总而言之,这是我想要实现的目标:

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 的答案

谢谢

【问题讨论】:

  • 答案不应该属于用户。如果我要回答这个问题,那么答案将属于我。
  • 是的,它需要深入到用户,但通过一个问题。我想要做的是 user.questions.find(1).answers ,这会返回这个特定用户完成的这个问题的答案。

标签: ruby-on-rails ruby rails-activerecord ruby-on-rails-5


【解决方案1】:

我认为您应该使用belongs_to 来代替:user:question(而不是has_one),并手动将用户设置为来自控制器中current_user 的答案。

【讨论】:

  • 现在我有以下错误:MethodError: undefined method `question' for #<0x00000002e7c280>
猜你喜欢
  • 2018-06-16
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
相关资源
最近更新 更多