我有一个关于检索数据库数据的问题。
我有一个模型Notification
,它有标准的Rails属性created_at
。
您可能知道,在访问ActiveSupport::TimeWithZone
对象时,此属性确实包含超精确值,您可以通过强制转换to_i
甚至to_f
所以现在我想将where
子句写入Notification
模型并查找在一定时间后创建的通知。但由于可能在同一秒内创建了多个通知,因此我希望在查询中获得更高的精度,因此我尝试编写这样的子句:
Notification.where('created_at > ?', timestamp)
它似乎没有用。
如何转换created_at值以便能够将其与时间戳进行比较?
答案 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