1

我在我的项目中使用 MongoDB 和 Mongoid。我在订购“时间”字段数据时遇到了一些困难。

如您所知,即使您Time在 Mongoid 文档中设置了字段类型,时间数据也会以这种格式存储(请注意,我使用 +2 小时偏移量来获取我自己的时区时间而不是 UTC):

Mon, 31 Dec 2012 08:30:00 EET +02:00

我不确定我是否遗漏了什么,但这就是发生在我身上的事情。

我想在Time我的一个视图中使用该数据。我需要按 ONLYHour:Minute格式对一些相关的东西进行排序。我不希望 Rails 处理字段数据的 DATE 部分。因为每当将新Time记录插入数据库时​​,都会将日期信息作为当前日期。

问题是:

因为它为每条新Time记录保存了当前日期,所以当我尝试order_by("hour DESC")新记录时总是首先检索到,即使 HOUR 部分数据更大!

例如:

First data:
=> Tue, 27 Nov 2012 19:50:00 EET +02:00
Second data:
=> Mon, 24 Dec 2012 18:45:00 EET +02:00

如您所知,通常 19:50 大于 18:45。但在这种情况下,由于 Rails 将day信息纳入计算,18:45 看起来比 19:50 大!

那么这个问题的解决方法是什么?

提前感谢。

4

2 回答 2

2

我在 Mongoid 的问题列表中找到了答案: https ://github.com/mongoid/mongoid/issues/1169

这真的很奇怪...

如果我理解得很好,Time字段类型完全没用!DateTime和然后有什么区别Time??

您甚至无法仅在Time字段内比较小时和分钟。

屏住呼吸,为周围的工作...

解决方案是:

不要使用Time字段类型!只需String通过该程序使用和比较小时和日期。

Person.where(:time.gt => "13:00")

如果有人能解释这种奇怪的情况,我会很高兴。

于 2012-12-31T11:57:27.567 回答
1

存储一天中时间的最佳方式是在 Integer 字段中作为 seconds_since_midnight。然后就可以正常排序了。

field :time, type: Integer
validates :time, presence: true, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 86399 }

http://api.rubyonrails.org/classes/DateTime.html#method-i-seconds_since_midnight http://api.rubyonrails.org/classes/Time.html#method-i-seconds_since_midnight

于 2013-08-29T20:31:21.903 回答