我想获取created_at字段小于今天(日期)的所有记录。 有没有像:
MyTable.find_by_created_at(< 2.days.ago)
答案 0 :(得分:140)
以标准方式使用ActiveRecord:
MyModel.where("created_at < ?", 2.days.ago)
使用基础Arel界面:
MyModel.where(MyModel.arel_table[:created_at].lt(2.days.ago))
在Arel上使用thin layer:
MyModel.where(MyModel[:created_at] < 2.days.ago)
使用squeel:
MyModel.where { created_at < 2.days.ago }
答案 1 :(得分:3)
要获取直到2天前创建的MyTable
的所有记录:
MyTable.where(created_at: Date.new..2.days.ago)
请注意,您将来也可以类似的方式查找包含字段的字段的记录,即至少从现在起2天以MyTable
的形式获取event_date
的所有记录:
MyTable.where(event_date: 2.days.from_now..DateTime::Infinity.new)
答案 2 :(得分:1)
另一种方法是使用Arel界面在MyModel
或ApplicationRecord
中创建范围,例如his answer中提到的 tokland ,如下所示:
scope :arel, ->(column, predication, *args) { where(arel_table[column].public_send(predication, *args)) }
范围的示例用法:
MyModel.arel(:created_at, :lt, 2.days.ago)
对于所有预测,请检查documentation或source code。此范围不会打破where
链。这意味着你也可以这样做:
MyModel.custom_scope1.arel(:created_at, :lt, 2.days.ago).arel(:updated_at, :gt, 2.days.ago).custom_scope2
答案 3 :(得分:-28)
Time.now现在指的是现在或现在指的是第二个。因此,要立即查找所有用户,请使用
@users = User.all
这将在之前找到所有用户,并将排除在Time.now
之后加入的未来用户或用户