Rails“Where”方法 - 使用无限范围大于 (">")

Cla*_*lor 11 activerecord ruby-on-rails range

我最近发现了一个巧妙的技巧来替换 Rails 中的大于/小于,where其中您可以使用范围来替换 where 的字符串版本:

Post.where('id <= ?', 10)

可以替换为:

Post.where(id: ..10)

三个点将其从 更改<=<

Post.where('id < ?', 10)

可以替换为:

Post.where(id: ...10)

这个技巧似乎适用于:

  • 小于或等于<=
  • 少于<
  • 大于或等于>=

然而,它不适用于大于,>因为:

Post.where(id: 10..)并且Post.where(id: 10...)都会搜索大于或等于。

我的问题是,有没有办法让它工作得比(除了用 破解它+ 1?):

Post.where(id: (10+1)..)

我的假设是答案是否定的,但我还是想问!

这是我正在谈论的内容的完整示例:


Post.where(id: ..9)
=>   Post Load (0.3ms)  SELECT "posts".* FROM "posts" WHERE "posts"."id" <= $1  [["id", 9]]

Post.where(id: ...9)
=>   Post Load (0.3ms)  SELECT "posts".* FROM "posts" WHERE "posts"."id" < $1  [["id", 9]]

Post.where(id: 1..)
=>   Post Load (0.4ms)  SELECT "posts".* FROM "posts" WHERE "posts"."id" >= $1  [["id", 1]]

# NOTE: THIS STILL ONLY GOES >=, NOT > 
Post.where(id: 1...)
=>   Post Load (0.4ms)  SELECT "posts".* FROM "posts" WHERE "posts"."id" >= $1  [["id", 1]]
Run Code Online (Sandbox Code Playgroud)

AbM*_*AbM 8

您可以使用where.not

Post.where.not(id: ..10).to_sql
# => SELECT "posts".* FROM "posts" WHERE "posts"."id" > 10
Run Code Online (Sandbox Code Playgroud)
Post.where.not(id: ...10).to_sql
# => SELECT "posts".* FROM "posts" WHERE "posts"."id" >= 10
Run Code Online (Sandbox Code Playgroud)

请注意,这Post.where(id: (10+1)..)是有效的,因为它id是一个整数列。但是,这不适用于小数列,例如Post.where('average_rating > 3.0'). 使用Post.where(average_rating: (3.0+1)..)将查找平均评分 > 4 但跳过平均评分为 3.5 的帖子。Post.where.not(average_rating: ..3.0)将产生正确的查询。