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

时间:2016-10-12 14:34:23

标签: mysql sql ruby-on-rails postgresql associations

这是一个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')

结果包含具有这两种状态的用户。 感谢您知道如何解决这个问题!

2 个答案:

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

EDIT2

为用户提供可用天数而没有预订的用户我可能会这样做:

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