我试图找到id大于200的所有用户,但我在特定的语法上遇到了一些麻烦。

User.where(:id > 200) 

and

User.where("? > 200", :id) 

都失败了。

有什么建议吗?


当前回答

我经常在日期字段中遇到这个问题(比较操作符非常常见)。

进一步阐述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将处理查询生成的那一部分。

其他回答

另一种奇特的可能性是……

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)

我经常在日期字段中遇到这个问题(比较操作符非常常见)。

进一步阐述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将处理查询生成的那一部分。

试试这个

User.where("id > ?", 200) 

短:

User.where("id > 200")

更好的用法是在用户模型中创建一个作用域(arel_table[:id].gt(id))