Ruby on rails ActiveRecord:毫秒为';在使用where子句时不考虑

Ruby on rails ActiveRecord:毫秒为';在使用where子句时不考虑,ruby-on-rails,datetime,milliseconds,Ruby On Rails,Datetime,Milliseconds,我正在处理一个带有rails api和iOS客户端的项目,使用更新的_at字段作为参考,以检测上次从客户端拉取后服务器上发生的修改 datetime更新的_的精度以毫秒为单位,这意味着 Model.updated_at.to_f 返回类似“1368977381.063427”的内容。 发送给客户端的格式为“2013-05-19T15:29:41.063427000Z” 问题是,当我从客户机获取datetime,解析它并用它进行查询时,毫秒就丢失了 last_update = DateTime.

我正在处理一个带有rails api和iOS客户端的项目,使用更新的_at字段作为参考,以检测上次从客户端拉取后服务器上发生的修改

datetime更新的_的精度以毫秒为单位,这意味着

Model.updated_at.to_f
返回类似“1368977381.063427”的内容。 发送给客户端的格式为“2013-05-19T15:29:41.063427000Z”

问题是,当我从客户机获取datetime,解析它并用它进行查询时,毫秒就丢失了

last_update = DateTime.strptime("2013-05-19T15:29:41.063427000Z", "%Y-%m-%dT%H:%M:%S.%N%z")
Model.where("updated_at > ?", last_update)
和做一样好

last_update = DateTime.strptime("2013-05-19T15:29:41Z", "%Y-%m-%dT%H:%M:%S%z")
Model.where("updated_at > ?", last_update)
因此,当我应该没有结果时,我总是至少得到一个结果,因为毫秒被截断

在我的查询中如何考虑这些因素?

试试看

Model.where("updated_at > ?", last_update.strftime("%Y-%m-%dT%H:%M:%S.%N%z"))
您还可以通过设置(即在初始化器中)将此格式设置为数据库中DateTime的标准格式:

然后,原始查询再次工作:

Model.where("updated_at > ?", last_update)

有关
日期时间.到
(又称为.到格式化)

的信息,请参阅。如果您使用的是ISO8601标准,则可以使用
.ISO8601(10)
。不知道为什么,但默认情况下它会舍入到秒。

我的问题是,存储在数据库中的时间戳的精度是小数点后5位,而我的客户机将时间戳存储到小数点后3位。。。当执行大于查询时,由于额外的2位小数,它总是返回相同的记录。我很惊讶Rails中没有更原生的方式来支持毫秒-/链接到Rails API的注释是最有帮助的,因为它可以帮助您确定在代码中更改哪些内容以启动并运行“标准逻辑”
Model.where("updated_at > ?", last_update)