在构建查询

时间:2015-09-25 12:23:42

标签: ruby-on-rails ruby postgresql activerecord

我有一个关于检索数据库数据的问题。

我有一个模型Notification,它有标准的Rails属性created_at。 您可能知道,在访问ActiveSupport::TimeWithZone对象时,此属性确实包含超精确值,您可以通过强制转换to_i甚至to_f

来访问该属性

所以现在我想将where子句写入Notification模型并查找在一定时间后创建的通知。但由于可能在同一秒内创建了多个通知,因此我希望在查询中获得更高的精度,因此我尝试编写这样的子句:

Notification.where('created_at > ?', timestamp)

它似乎没有用。

如何转换created_at值以便能够将其与时间戳进行比较?

1 个答案:

答案 0 :(得分:1)

时间戳比较工作正常,即使在亚秒级也是如此。

尝试尝试:

# create two users
u1 = User.create(name:'user1')
u2 = User.create(name:'user2')
d1 = u1.created_at
d2 = u2.created_at

# update d1 so that it's exact second (milliseconds = 0)
# update d2 so that it's exactly d1 + 0.5sec
d1 = d1 - (d1.to_f - d1.to_i)
d2 = d1 + 0.5
u1.created_at = d1
u2.created_at = d2

# now create a timestamp just between d1 and d2
d0 = d1 + 0.25

# those queries now give expectable results
User.where('created_at<?',d0).count # => 1
User.where('created_at>?',d0).count # => 1

小心但是:

User.where('created_at=?',d1).count # => 0
User.where('created_at=?',d2).count # => 0

d1 = u1.created_at
User.where('created_at=?',d1).count # => 1