如何仅按小时订购数据:MongoDB / Mongoid中的分钟格式? (没有约会!)

时间:2012-12-31 11:08:00

标签: ruby-on-rails ruby-on-rails-3 mongodb mongoid mongoid3

我在我的项目中使用MongoDB和Mongoid。订购时遇到一些困难" Time"现场数据。

如您所知,尽管您在Mongoid文档中将字段类型设置为Time,但时间数据将以此格式存储(请注意,我使用+2小时偏移量来获取自己的时区' s时间而不是UTC):

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

我不确定我是否遗漏了一些东西,但这就是我发生的事情。

我想在我的一个视图中使用Time数据。我需要通过Hour:Minute格式对一些相关的东西进行排序。我不希望Rails处理现场数据的DATE部分。因为无论何时将新的Time记录插入到数据库中,它都会将当天信息视为当前日期。

问题是:

因为它为每个新的Time记录保存了CURRENT DAY,所以当我尝试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更大!

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

感谢advence。

2 个答案:

答案 0 :(得分:2)

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

那真的很受欢迎......

如果我理解得很好,Time字段类型完全没用! DateTimeTime之间有什么区别呢?

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

为你的工作屏住呼吸......

解决方案是:

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

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

如果有人可以解释这种情况,我会很高兴。

答案 1 :(得分:1)

存储时间的最佳方式是在整数字段中的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