【问题标题】:Rails find records where relationship doesn't include an idRails 查找关系不包含 id 的记录
【发布时间】:2016-06-24 20:43:50
【问题描述】:
class Question
  has_many :participants, :class_name => "User"
end

class User
  has_and_belongs_to_many :questions
end

现在,给定一个用户,我想查找该用户没有参与的所有问题。

类似于Question.where("participants DOES NOT INCLUDE user.id"),但实际上是有效的。我该怎么做呢?

【问题讨论】:

  • 您的关系似乎应该是 has_and_belongs_to_manyhas_many through 关系。正如您所写的,用户应该有一个belongs_to :question 关联,这没有意义——每个用户都会参与一个且只有一个问题。你能发布你的用户模型的相关部分吗?
  • @RobertNubel 已更新

标签: ruby-on-rails rails-activerecord


【解决方案1】:
Question.joins(:participants).where("users.id != ?", user.id)

【讨论】:

  • users.id 应该是participant.id 吗?为什么或为什么不?
  • 这将无法正常工作。假设问题 1 有两个参与者,A 和 B;如果给定的用户是 A,问题 1 仍然会被返回,因为它有一个不是 A 的参与者 (B)。
  • @RobertNubel 呢Question.where.not("participants.id == ?", @user.id)
  • Where 子句一次只查看连接关系的一行。您需要一个 GROUP BY、一个子查询或一个窗口函数来同时考虑其他行的上下文。有关此问题的首选解决方案,请参阅我的答案。
  • 我认为这是一个 has_many,belongs_to,而不是 habtm,如果您有带连接表的 habtm,请按照@RobertNubel 的回答,原始问题没有指定用户模型
【解决方案2】:

就可读性和可组合性而言,您最好的选择是子查询:

Question.where(
  "NOT EXISTS (SELECT 1 FROM questions_users WHERE question_id=questions.id
   AND user_id=?)", user.id)

【讨论】:

  • 这是否假定一个新表questions_users
  • Users has_and_belongs_to_many questions.. 它说 questions_users 表存在
  • 您的 has_and_belongs_to_many 关系应该已经自动创建了该连接表。否则,每个用户只能有一个问题。
  • Question.joins("LEFT JOIN users ON users.question_id = questions.id").where("users.id IS NULL") 如果你的关系是 has_many 而不是 HABTM
  • 是的,您将需要该连接表并将您的问题模型更改为 has_and_belongs_to_many :users。请参阅stackoverflow.com/a/18165354/5086701 设置范围以检查用户是否属于问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 2014-08-16
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多