«前の日記(2008-09-09) 最新 編集

野ログはノロキュアMaxHeart


2008-11-05

_ TimeのインスタンスをRailsプロジェクト内から撲滅せよ!撲滅せよ!!

ActiveRecordのUTC保存をうまく使うためにはTimeインスタンスを使っていてはけない。

t1 = Time.local(2008, 11, 1)
Entry.all(:conditions => ["created_at > ?", t1])
#SELECT * FROM "entries" WHERE (created_at > '2008-11-01 00:00:00')

t2 = Time.zone.local(2008, 11, 1)
Entry.all(:conditions => ["created_at > ?", t2])
#SELECT * FROM "entries" WHERE (created_at > '2008-10-31 15:00:00')


>> Time.now.class
=> Time

>> Time.zone.now.class
=> ActiveSupport::TimeWithZone

自前でUTCで検索しようとしたらTime#utcメソッドが破壊的で焦った。

ActiveSupport::TimeWithZoneだと破壊的ではなくなってる。

>> t1 = Time.now
=> Wed Nov 05 16:45:41 +0900 2008
>> t1.utc
=> Wed Nov 05 07:45:41 UTC 2008
>> t1
=> Wed Nov 05 07:45:41 UTC 2008

>> t2 = Time.zone.now
=> Wed, 05 Nov 2008 16:46:19 JST +09:00
>> t2.utc
=> Wed Nov 05 07:46:19 UTC 2008
>> t2
=> Wed, 05 Nov 2008 16:46:19 JST +09:00

ActiveSupport::TimeWithZoneのこと知らないまま月の最初から最後までを検索しようとするコードを書こうとして

UTC保存されていることを思い出し、とりあえずUTCで検索かけようと思って書いたコードが…

t = Time.local(2008, 11, 1)
Entry.all(:conditions => ["created_at >= ? AND created_at <= ?", t.utc, t.end_of_month.utc])
#SELECT * FROM "entries" WHERE (created_at >= '2008-10-31 15:00:00' AND created_at <= '2008-10-31 23:59:59')

意図したものと全く違うSQLががが・・・!

(これはActiveRecordというよりTime#utcのこと理解してなかった問題ですが。)

ActiveSupport::TimeWithZoneを使えば解決。

t = Time.zone.local(2008, 11, 1)
Entry.all(:conditions => ["created_at >= ? AND created_at <= ?", t.utc, t.end_of_month.utc])
#SELECT * FROM "entries" WHERE (created_at >= '2008-10-31 15:00:00' AND created_at <= '2008-11-30 14:59:59')

というかutcよぶ必要ないですよ。

t = Time.zone.local(2008, 11, 1)
Entry.all(:conditions => ["created_at >= ? AND created_at <= ?", t, t.end_of_month])
#SELECT * FROM "entries" WHERE (created_at >= '2008-10-31 15:00:00' AND created_at <= '2008-11-30 14:59:59')

いちいちutcつけるとか絶対忘れるのでTime使わないように気をつけよう。

Tags: memo rails

Bookmark this entry:    Yahoo! bookmark    del.icio.us del.icio.us    Hatena Hatena    Buzzurl Buzzurl    livedoor clip livedoor clip

本日のツッコミ(全1件) [ツッコミを入れる]
_ wataru (2008-12-24 09:34)

ここで言う中身じゃないかもしれませんが・・・ <br>ここしか検索できなくて失礼します。 <br>コピペ運動会が見れなくなってしまいました。 <br>閲覧と※欄でのツッコミを日課としていた私は涙目です <br>例のサーバーの問題でしょうか? <br> <br>復帰を切に望みます <br>ω          <br> \(бゝб)/

お名前:
E-mail:
右の画像に書かれている文字列を入力してください:
コメント:
[]

«前の日記(2008-09-09) 最新 編集

最近の記事

最近のコメント

  1. wataru (12-24)
  2. 元木仁 (12-06)
  3. 榊 (09-09)
  4. 榊 (09-09)
  5. nog (09-09)
  6. 榊 (09-09)
  7. willnet (07-29)
  8. 要望 (07-19)
  9. nog (05-12)
  10. Googleから (05-10)

最近のトラックバック

  1. treasuring misc.:軍議nightにて、.. (2007-08-21 13:01)
  2. プッチャンの無双声優マニアック.. (2007-06-06 11:01)
  3. エム会議:まるでドラゴンクエス.. (2006-12-19 00:05)

作ったもんとか

チョコ鑑定
あなたのもらったチョコのレシピを鑑定します。
今時名前メーカー
あなたに今風の名前をプレゼントします。
コピペ運動会
ユーザー参加型コピペ投稿サイト
はうまっち?
楽天市場の価格を当て合うコミュニティ
Award on Rails楽天賞受賞
公開メモ
公開してるメモ用wiki

アンテナ

タグリスト

過去ログ

2003|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|
2006|05|06|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|07|09|11|

その他

フィードメーター - 野ログはノロキュアMaxHeart あわせて読みたいブログパーツ