1

プロジェクトで MongoDB と Mongoid を使用しています。「時間」フィールド データの順序付けに問題があります。

ご存知のようTimeに、Mongoid ドキュメント内でフィールド タイプを設定しても、時間データはこの形式で保存されます (UTC の代わりに +2 時間のオフセットを使用して独自のタイムゾーンの時間を取得していることに注意してください)。

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

何かが欠けているかどうかはわかりませんが、これが私に起こることです。

Timeビューの 1 つの中でそのデータを使用したいと考えています。関連するものをHour:Minuteフォーマットのみでソートする必要があります。フィールド データの DATE 部分を Rails に処理させたくありません。新しいレコードが DB に挿入されるたびにTime、日付情報が CURRENT DAY として取得されるためです。

問題は次のとおりです。

そのため、新しいレコードごとに CURRENT DAY が保存されるため、新しいレコードを取得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

時刻を保存する最善の方法は、整数フィールドに 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 に答える