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


87

我想获取created_at字段小于今天(日期)的所有记录。是否有类似的东西:

MyTable.find_by_created_at(< 2.days.ago)

Answers:


167

使用ActiveRecord的标准方法是:

MyModel.where("created_at < ?", 2.days.ago)

使用基础的Arel接口:

MyModel.where(MyModel.arel_table[:created_at].lt(2.days.ago))

在Arel上使用薄层

MyModel.where(MyModel[:created_at] < 2.days.ago)

使用squeel

MyModel.where { created_at < 2.days.ago }

谢谢!。如果在相同条件下需要MyTable1中与MyTable一对一关系的所有记录,该如何编写查询?我指的MyTable1.where(MyTable[:created_at] < Time.now)是这样吗?
2011年

是的,我已经设置了关系活动记录类。
2011年

11

要获取MyTable2天之前创建的所有记录:

MyTable.where(created_at: Date.new..2.days.ago)

请注意,您也可以寻找记录包含的字段在类似的方式对未来的字段,即获得的所有记录MyTableevent_date至少2天从现在开始:

MyTable.where(event_date: 2.days.from_now..DateTime::Infinity.new)

这产生"created_at" BETWEEN $1 AND $2 [["created_at", "4713-01-01 BC"], ["created_at", "2020-03-31 21:43:28.113759"]]
Pavel Chuchuva

2

另一种方法是创建一个范围MyModelApplicationRecord使用阿雷尔一样的界面tokland在sugensted他的回答像这样:

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

范围的用法示例:

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

对于所有谓词,请查看文档源代码。此范围不会中断where链条。这意味着您还可以:

MyModel.custom_scope1.arel(:created_at, :lt, 2.days.ago).arel(:updated_at, :gt, 2.days.ago).custom_scope2

很棒的主意。但是,ActiveRecord::Relation使用名称定义实例方法,arel这意味着您只需要选择其他名称即可。
M-Dahab

-36

Time.now是指现在或此秒。因此,要立即找到所有用户,只需使用

@users = User.all

这将立即找到所有用户,并将排除将来的用户或在Time.now之后加入的用户。


1
Time.now与今天不同
John Naegle 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.