这是一个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')
结果包含具有这两种状态的用户。 感谢您知道如何解决这个问题!
答案 0 :(得分:2)
我想找到所有只有可用日期的用户。
对于此类事情,您应该使用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
如果我误解了您,并且状态不是"booked"
或"available"
(但是,例如,可以为空或nil
),则查询应该与您一样与where.not
:
User.joins(:days).where.not(days: { status: 'booked' }).group('users.id')
为用户提供可用天数而没有预订的用户我可能会这样做:
User.joins(:days).where.not(days: { status: 'booked' }).where(days: { status: 'available' }).group('users.id')
答案 1 :(得分:0)
@CptMisery正确回答了它。 Rails语法如下所示:
User.where.not(id: Day.select(:user_id).distinct.where(status: 'booked'))