2012-04-18 6 views
0

私は、関連付けで定義されたクラスメソッドで次のコードを持っています。その値がキャッシュされるのか、それともスコープだけのものなのでしょうか? インスタンスまたはクラスメソッドでTime.zone.now.to_dateを使用していますか?

def for_today 
    where 'planned_for = ?', Time.zone.now 
end 

は私がスコープで下記行う場合Time.zone.now値はクラスがキャッシュされたときと同じになり、明らかにし、私は、これは上記のために起こらないことを確認したいですかそれを回避する方法。

scope :for_today, where('planned_for = ?', Time.zone.now) 

だから、動的な値を使用しているスコープを書くの正しい方法は

scope :for_today, lambda { where('planned_for = ?', Time.zone.now) } 

のようなラムダを使用することです、私はクラスまたはインスタンスメソッドのためとあれば似た何かをする必要がありますそれは正確に何ですか?

答えて

1

いいえ、その値はクラスメソッドとインスタンスメソッドでキャッシュされないため、安全に使用できます。 親指のルールとして、単純条件の場合はscopeを使用し、より複雑な場合はクラスメソッドを使用します。

また、デフォルト設定では、データベースに保存されている時間はすべてUTCであるため、Time.nowはUTCに自動変換されるため、使用することができます。

+0

私たちのデータベースはいくつかの米国時間帯として日付を保存するのに十分なほど愚かですが、ありがとうございました。私はそれを変更するつもりです。ストレージにUTC以外のものを使用する理由はありません – mhenrixon

関連する問題