【问题标题】:Find a record with ALL associations having a certain value查找具有特定值的所有关联的记录
【发布时间】:2016-10-12 14:34:22
【问题描述】:

这更像是一个 SQL 问题,但我尝试在 Rails 中解决这个问题:

我有一个Userhas_many :days。 Days 有一个status,它可以是availablebooked。我想找到所有只有可用天数的用户。我用:

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

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

【问题讨论】:

  • 不知道如何在rails中进行,但查询需要更像这样:SELECT * FROM users WHERE id NOT IN (SELECT DISTINCT user_id FROM days WHERE status = 'booked')
  • “谁只有可用的日子”是什么意思?您想要某一天(或一组天)有空的用户还是根本没有预订天数的用户?
  • @max 我试图找到全天都有空的用户。我将把它合并成一个.where(dated: from..too) 范围。

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


【解决方案1】:

我想查找所有只有可用天数的用户。

对于这种类型的东西你应该使用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')

编辑2

为了让用户有可用天数而没有预订天数,我可能会这样做:

User.joins(:days).where.not(days: { status: 'booked' }).where(days: { status: 'available' }).group('users.id')

【讨论】:

  • User.joins(:days).where.not(days: { status: 'booked' })
  • @max 从问题中我(不知何故)得出结论,status 只是“已预订”或“可用”。但你说得对,我们在回答时必须准确。
  • 这不会返回任何有至少天未“预订”的用户吗?最初的问题询问如何找到“所有只有可用天数的用户”
  • 感谢您的回答!结果是同一用户数倍(.distinct 可以阻止)。正如@gmcnaughton 已经说过的,我试图找到所有时间都可用的用户。有什么想法吗?
  • @Railsana 按 users.id 添加分组将解决同一用户出现两次的问题。至于状态 - 你可以同时查询,让我编辑答案。
【解决方案2】:

@CptMisery 回答正确。 Rails 语法如下所示:

User.where.not(id: Day.select(:user_id).distinct.where(status: 'booked'))

【讨论】:

    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多