对同一个表的两列的Rails查询等于它们的值

时间:2017-11-29 16:18:11

标签: ruby-on-rails arel

我试图找出是否存在更多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和第一个使用Arel的查询之间的差异。

1 个答案:

答案 0 :(得分:0)

您可以使用arel做到这一点:

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