QA@IT

mongoidでのtimestampに対する時間比較

2099 PV

環境:
mongoid
rails3.2

現在、version毎に作成された時間をhashで保存しておき(例{"1"=>2012-08-06 15:00:00 UTC,"2" => 2012-08-07 15:00:00 UTC})、このhashの時間と、対象のデータのupdated_atを比較することによって、特定のバージョンから変更されたquizの一覧を取得しようと考えております。
しかし時間の比較がうまくいきません。

実際に問題になっているソースコードで説明させていただきます。

#ここは本来hashから取ってくるべきだが、質問の本質ではないのでTime.nowで
time_oldversion =  Time.now

@quizzes_json = Quiz.where(:project_id => params[:project_id]).where('updated_at > '+ time_oldversion.to_s)

この@quizzes_json.countを実行した際に結果は0になります。これは大なり小なりを逆にしても('updated_at < ')にしても同じです。またQuiz.where(:project_id => params[:project_id])の時点では1000件ほどの結果が返ってきています。
私にはこの結果はとても不思議です。普通に考えて大の結果+小の結果は1000件にはなるはずだからです。

なぜこのような現象が起こるのでしょうか?

以下からの記述は私の主観的な判断を多分に含みます。
この現象を私なりに原因を考えたのですが、rubyのTimeの扱いに不可解なところがあるからではないかと考えています。
具体的にソースで説明させていただきます。

Time.now
=> 2012-08-08 17:34:23 +0900
Time.now.to_s
=>"2012-08-08 17:37:39 +0900"
Time.now.to_s.to_Time
=>2012-08-08 08:38:55 UTC

このようになぜかStringに変えて、Timeに直すと時間が変わっています。
この現象はDBに保存されたデータでも確認され、Time.nowで取得した時間をDBに保存しても、~UTCに変わっていました。
そのため、時間の比較が正常に行えずにこのような結果になってしまったのではないかと考えています。

回答

mongoidのバージョンによりますが

  • 昔のやつ (2.4系など)

    irb :001> Quiz.where(略).where(:updated_at.gte => time_oldversion)
    
  • わりと最近のやつ (3系)

    文法が変わったようです

    irb :001> Quiz.where(略).gte(:updated_at, time_oldversion)
    

お試しください。

編集 履歴 (0)
  • 回答ありがとうございます。こちらに書いてある方法で絞り込めました、またTimeのほうは指定するメソッドがあり、それを使えばかいけつ できました -
ウォッチ

この質問への回答やコメントをメールでお知らせします。