这更像是一个 SQL 问题,但我尝试在 Rails 中解决这个问题:
我有一个用户
,他有_many :days
。天数有一个状态
,可以是可用或已预订。我想找到所有只有可用天数 的用户。我使用:
User.includes(:days).where.not(days: { status: 'booked' }).references(:days)
生成的 SQL 查询如下所示:
SELECT * FROM "users" LEFT OUTER JOIN "days" ON "days"."user_id" = "users"."id" WHERE ("days"."status" != 'booked')
结果包含具有两种状态的用户。 感谢您提供解决此问题的任何想法!
最佳答案
I want to find all users who have only available days.
对于这类事情你应该使用joins
:
User.joins(:days).where(days: { status: 'available' }).group('users.id')
生成的 SQL 看起来像这样:
SELECT users.* FROM users INNER JOIN days ON days.user_id = users.id WHERE days.status = available
编辑
如果我误解了你,状态既不是“已预订”
也不是“可用”
(但是,例如,可以是空白或nil
),那么查询应该和你在 where.not
中的一样:
User.joins(:days).where.not(days: { status: 'booked' }).group('users.id')
编辑2
为了让用户有可用天数而没有预订天数,我可能会这样做:
User.joins(:days).where.not(days: { status: 'booked' }).where(days: { status: 'available' }).group('users.id')
关于mysql - 查找具有特定值的所有关联的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40001353/