查找具有特定值的所有关联的记录

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'))