You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:45:03