活动记录子集,取决于updated_at和creatd_at之间的差异

时间:2018-07-26 16:05:26

标签: sql ruby-on-rails ruby postgresql rails-activerecord

在我的模型消息数据库中,我有一个created_at属性用于存储对象的首次创建时间,还有一个status_updated_at属性用于存储对象的状态更新的时间。这两个属性均为ActiveSupport::TimeWithZone 我正在尝试在created_at的3分钟内找到status_updated_at在数据库中的所有对象。

我已经尝试过Message.where("status_updated_at<=(created_at+180.seconds)")Message.where("(status_udpated_at-created_at)<=180.seconds")

他们俩都给了我#<Message::ActiveRecord_Relation:0x3843d7c> 。但是,当我尝试对它们进行计数时,例如Message.where("status_updated_at<=(created_at+180.seconds)").count,出现以下错误:

ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR:  syntax error at or near "seconds"
LINE 1: ...essages" WHERE ((status_udpated_at-created_at)<=180.seconds)
                                                               ^
: SELECT COUNT(*) FROM "messages" WHERE ((status_udpated_at-created_at)<=180.seconds)
from /var/lib/gems/2.3.0/gems/activerecord-5.1.2/lib/active_record/connection_adapters/postgresql_adapter.rb:620:in `async_exec'

我应该如何在created_at的3分钟(180秒)内获取具有status_updated_at的邮件计数?

谢谢。

1 个答案:

答案 0 :(得分:2)

两个timestamps in PostgreSQL is an interval值和interval之间的区别有一些方便的text representations,因此您可以这样说:

Message.where('status_updated_at - created_at <= ?', '3 minutes').count
Message.where('status_updated_at - created_at <= ?', '180 seconds').count