活动记录 - 查找今天之前创建的记录

时间:2011-11-02 09:22:37

标签: ruby activerecord

我想获取created_at字段小于今天(日期)的所有记录。 有没有像:

MyTable.find_by_created_at(< 2.days.ago)

4 个答案:

答案 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界面在MyModelApplicationRecord中创建范围,例如his answer中提到的 tokland ,如下所示:

scope :arel, ->(column, predication, *args) { where(arel_table[column].public_send(predication, *args)) }

范围的示例用法:

MyModel.arel(:created_at, :lt, 2.days.ago)

对于所有预测,请检查documentationsource 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

之后加入的未来用户或用户