在Rails中如何编写where查询实现两个日期字段的比较?
问题原因
你之前的写法MyModel.where(:submitted_at < :created_at)失效的核心原因是:Ruby会先对符号比较表达式:submitted_at < :created_at直接求值,结果为true,最终执行的查询等价于MyModel.where(true),自然返回所有记录。
正确实现方案
你可以根据需求选择以下任意一种写法:
- 最简单的手写SQL条件(无SQL注入风险,适配所有Rails支持的数据库)
MyModel.where("submitted_at < created_at") - 更符合Rails ORM规范的Arel写法(自动适配不同数据库的语法差异,可维护性更高)
# 可以单独使用 mymodel_table = MyModel.arel_table MyModel.where(mymodel_table[:submitted_at].lt(mymodel_table[:created_at])) # 也可以封装为模型的scope方便复用,添加到MyModel的类定义中即可 scope :submitted_before_creation, -> do arel_table = self.arel_table where(arel_table[:submitted_at].lt(arel_table[:created_at])) end # 封装后直接调用即可 MyModel.submitted_before_creation
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

