查找具有特定值的所有关联的记录
Find a record with ALL associations having a certain value
这更像是一个 SQL 问题,但我尝试在 Rails 中解决这个问题:
我有一个 User
has_many :days
。天数 status
可以 可用 或 预订。我想找到所有 可用天数 的用户。我使用:
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
编辑
如果我误会你了,status既不是"booked"
也不是"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')
@CptMisery 回答正确。 Rails 语法如下所示:
User.where.not(id: Day.select(:user_id).distinct.where(status: 'booked'))
这更像是一个 SQL 问题,但我尝试在 Rails 中解决这个问题:
我有一个 User
has_many :days
。天数 status
可以 可用 或 预订。我想找到所有 可用天数 的用户。我使用:
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
编辑
如果我误会你了,status既不是"booked"
也不是"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')
@CptMisery 回答正确。 Rails 语法如下所示:
User.where.not(id: Day.select(:user_id).distinct.where(status: 'booked'))