首页 > 解决方案 > 在 Rails 中,如何编写一个带有“where”的查找器来比较两个日期?

问题描述

我正在使用 Rails 4.2。我有一个具有这些日期时间属性的模型

submitted_at
created_at

如何编写一个查找器方法来返回所有模型,其中提交的字段按时间顺序出现在 created_at 字段之前?我试过这个

MyModel.where(:submitted_at < :created_at)

但这会返回我数据库中的所有内容,甚至是不匹配的项目。

标签: ruby-on-railsruby-on-rails-4activerecord

解决方案


where(:submitted_at < :created_at)实际上是where(false)。当您将两个符号与 lt/gt 运算符进行比较时,您实际上只是按字母顺序比较它们:

:a < :b # true
:c > :b # true

where(false)或任何其他空白的论点?只是返回链接的“无范围”关系。

ActiveRecord 查询界面实际上并没有直接的方法来比较这样的列。

您可以使用 SQL 字符串:

Resource.where('resources.submitted_at < resources.created_at')

或者使用 Arel 创建查询:

r = Resource.arel_table
Resource.where(r[:submitted_at].lt(r[:created_at]))

结果完全相同,但 Arel 解决方案可以说更具可移植性,并且避免了对表名进行硬编码(或创建模棱两可的查询)。


推荐阅读