【问题标题】:Rails query for two columns of the same table are equal to their valuesRails查询同一张表的两列是否等于它们的值
【发布时间】:2017-11-29 16:18:10
【问题描述】:

我正在尝试查找是否存在更多 Rails-y 方式来生成以下查询

# The purpose of this query is to select Users who have not updated
# their user record.

SELECT `users`.* FROM `users` WHERE `users`.`created_at` = `users`.`updated_at`

我可以使用 Arel 通过以下方式完成它:

arel_where = User.arel_table[:created_at].eq(User.arel_table[:updated_at])
User.where(arel_where)
  #=> … WHERE `users`.`created_at` = `users`.`updated_at`

但是,如果不访问表并使用它的相等方法,我就不能使用哈希语法的任何组合来执行此操作。以下两个由于将密钥转换为字符串而失败。

User.where(created_at: :updated_at)
  #=> … WHERE `users`.`created_at` = 'updated_at'

User.where(created_at: User.arel_table[:updated_at])
  #=> … WHERE `users`.`created_at` = '--- !ruby/struct:Arel::Attributes::Attribu…

编辑

虽然不是硬性要求,但我试图避免使用以下字符串:

User.where('created_at = updated_at')
  #=> WHERE (created_at = updated_at)

我有时会分析我的日志,并且需要考虑这与第一个使用 Arel 的查询之间的差异。

【问题讨论】:

    标签: ruby-on-rails arel


    【解决方案1】:

    User.where("created_at = updated_at")

    【讨论】:

    • 谢谢特德!我完全忘记解释为什么我不采用这种更简单的解决方案。这对很多人都有效,但我提出这个问题是因为我正在寻找一些不走寻常路的东西。
    【解决方案2】:

    你可以用 arel 这样做:

    User.where(User.arel_table[:created_at].eq(User.arel_table[:updated_at]))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2022-11-12
      • 2015-10-11
      相关资源
      最近更新 更多