在 rails 查询中使用大于小于时出现语法错误

syntax error when using greater than less than in rails query

User.where(is_individual: true)
  .includes(:visitor)
  .where(visitors: { finished: false })
  .where(visitors: { step > 2 })

我正试图摆脱上述查询,但它返回了一个错误

syntax error, unexpected '}', expecting =>)
...visitors: { step > 2 })

但如果我按照下面的方式操作,它就可以工作了。

User.where(is_individual: true)
  .includes(:visitor)
  .where(visitors: { finished: false })
  .where(visitors: { step: 2 })

因此查询不适用于大于运算符。

我什至尝试了下面的查询,但它仍然不起作用

User.where(is_individual: true)
  .includes(:visitor)
  .where(visitors: { finished: false })
  .where(visitors: { "step > ?", 2 })

您 运行 遇到的语法错误是由于传递给最后一个 where 子句的参数结构所致 - { "step > ?", 2 } 不是有效的 Ruby 对象。

如果使用 Ruby 2.6 或更高版本,您可以利用其 endless range syntax 构建查询:

User
  .includes(:visitor)
  .where(is_individual: true, visitors: { finished: false, step: 3.. })

如果使用 Ruby 2.5 或更低版本,您可以使用 Float::INFINITY:

生成相同的查询
User
  .includes(:visitor)
  .where(is_individual: true, visitors: { finished: false, step: 3..Float::INFINITY })

或者,您可以将 SQL 字符串传递给 where 以查询包含的模型(您需要通过 references 引用关联的 table) :

User
  .includes(:visitor)
  .references(:visitors)
  .where(is_individual: true)
  .where(visitors: { finished: false })
  .where("visitors.step > ?", 2)

在这种情况下,您还可以显式使用 joins 来检索所需的结果:

User
  .joins(:visitor)
  .where(is_individual: true)
  .where(visitors: { finished: false })
  .where("visitors.step > ?", 2)