我试图找到id大于200的所有用户,但我在特定的语法上遇到了一些麻烦。
User.where(:id > 200)
and
User.where("? > 200", :id)
都失败了。
有什么建议吗?
我试图找到id大于200的所有用户,但我在特定的语法上遇到了一些麻烦。
User.where(:id > 200)
and
User.where("? > 200", :id)
都失败了。
有什么建议吗?
当前回答
更新
Rails核心团队决定暂时恢复此更改,以便更详细地讨论它。更多信息请看这条评论和这篇PR。
我留下我的答案只是为了教育目的。
Rails 6.1中用于比较的新“语法”(已恢复)
Rails 6.1为where条件中的比较操作符添加了新的“语法”,例如:
Post.where('id >': 9)
Post.where('id >=': 9)
Post.where('id <': 3)
Post.where('id <=': 3)
所以您的查询可以改写如下:
User.where('id >': 200)
这里是PR的链接,在那里你可以找到更多的例子。
其他回答
我经常在日期字段中遇到这个问题(比较操作符非常常见)。
进一步阐述Mihai的回答,我相信这是一个可靠的方法。
你可以像这样给模型添加作用域:
scope :updated_at_less_than, -> (date_param) {
where(arel_table[:updated_at].lt(date_param)) }
... 然后在你的控制器中,或者在你使用模型的任何地方
result = MyModel.updated_at_less_than('01/01/2017')
... 一个更复杂的连接示例如下所示:
result = MyParentModel.joins(:my_model).
merge(MyModel.updated_at_less_than('01/01/2017'))
这种方法的一个巨大优势是:(A)它允许您从不同的作用域组合查询;(b)当您两次连接到同一个表时避免别名冲突,因为arel_table将处理查询生成的那一部分。
更新
Rails核心团队决定暂时恢复此更改,以便更详细地讨论它。更多信息请看这条评论和这篇PR。
我留下我的答案只是为了教育目的。
Rails 6.1中用于比较的新“语法”(已恢复)
Rails 6.1为where条件中的比较操作符添加了新的“语法”,例如:
Post.where('id >': 9)
Post.where('id >=': 9)
Post.where('id <': 3)
Post.where('id <=': 3)
所以您的查询可以改写如下:
User.where('id >': 200)
这里是PR的链接,在那里你可以找到更多的例子。
短:
User.where("id > 200")
另一种奇特的可能性是……
User.where("id > :id", id: 100)
如果您想在多个地方进行替换,该功能允许您创建更容易理解的查询,例如……
User.where("id > :id OR number > :number AND employee_id = :employee", id: 100, number: 102, employee: 1205)
这比拥有很多更有意义?关于查询…
User.where("id > ? OR number > ? AND employee_id = ?", 100, 102, 1205)
对于Ruby 2.6可以接受如下范围:
# => 2.6
User.where(id: 201..)
# < 2.6
User.where(id: 201..Float::INFINITY)