0

アソシエーションで定義されたクラスメソッドに次のコードがある場合。その値はキャッシュされますか、それともスコープ専用ですか?

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) }

クラスまたはインスタンスメソッドに対して同様のことを行う必要がありますか?そうであれば、正確には何ですか?

4

1 に答える 1

1

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

また、デフォルトの構成では、データベースに保存されるすべての時間は UTC で保存されるため、UTC に自動変換されるため、Time.now をそのまま使用できます。

于 2012-04-18T08:25:45.233 に答える