Active Record - 查找在今天之前创建的记录

101
我想获取所有创建日期早于今天的记录。 是否有类似这样的东西:
MyTable.find_by_created_at(< 2.days.ago)
3个回答

195

使用 标准方式 的 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获取所有记录,而MyTable1与MyTable之间是一对一的关系,并且具有相同的条件,该如何编写查询?我参考了类似于MyTable1.where(MyTable[:created_at] < Time.now)的语句,这样可以吗? - Sayuj
是的,我已经设置了关联活动记录类。 - Sayuj

14

获取 MyTable 中所有在两天前之前创建的记录:

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

请注意,您也可以以类似的方式查找将来包含字段的记录,即要获取所有具有event_date超过至少2天后的MyTable记录:

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

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

3

另一种方式是在 MyModel 或者 ApplicationRecord 中使用 Arel 接口创建一个作用域,就像 tokland他的答案 中所建议的那样:

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

使用范围的示例:

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

对于所有的预测,请查看文档源代码。这个作用域不会打破where链。这意味着你也可以这样做:

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

很棒的想法。但是,ActiveRecord::Relation 定义了一个名为 arel 的实例方法,这意味着您只需要选择另一个名称即可。 - M-Dahab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接