ruby-on-rails - 在 Rails 中,如何编写一个带有“where”的查找器来比较两个日期?
问题描述
我正在使用 Rails 4.2。我有一个具有这些日期时间属性的模型
submitted_at
created_at
如何编写一个查找器方法来返回所有模型,其中提交的字段按时间顺序出现在 created_at 字段之前?我试过这个
MyModel.where(:submitted_at < :created_at)
但这会返回我数据库中的所有内容,甚至是不匹配的项目。
解决方案
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 解决方案可以说更具可移植性,并且避免了对表名进行硬编码(或创建模棱两可的查询)。
推荐阅读
- html - 如何确保填充也影响所有行而不仅仅是第一行?
- ios - 如何在 iOS swift 中使用 AVPlayer 访问 iOS Files App 中存在的视频文件?
- ios - 如何在 iOS 13 的不同屏幕上显示不同的内容?
- python - 有没有办法在 python 中使用 DATA_BLOB?
- html - 导航栏使用 Flexbox 和无序列表的问题
- python - python str 对象不支持项赋值
- python - 复制包含 SimPy 进程的类实例的最简单方法是什么?
- python - 不正确的“浮动对象不可下标”错误
- azure - Sharepoint API 中带有 MSAL 令牌的未经授权的请求
- java - 将 csv 文件中的 double 属性转换为 java double 时出错。阿帕奇弗林克