1

ActiveRecordスコープで現在の日付を評価しようとすると、実行時ではなくアプリケーションコードがロードされたときに評価されるため、正しくない可能性があります。次のように、これをラムダでパススルーする必要があります。

scope :today, lambda { where(:submitted_at => Date.today.to_time.utc..(Date.today + 1).to_time.utc) }

時間への変換が発生するため、これはファンキーな例です。とにかく、私の質問は、これが他にどこに懸念があるのか​​ということです。ActiveRecordスコープは、実行時に評価されていないDateへの呼び出しを信頼できる唯一の場所ですか?

4

1 に答える 1

2

を宣言すると、クラス自体scopeのメソッドを呼び出します。scopeこれは、あなたが言ったように、実行時ではなく読み込み時に行われます。

これは、クラスの宣言でメソッドを呼び出すたびに発生します。いくつかの例:

class Car < ActiveRecord::Base
  acts_as_combustion_machine
  belongs_to :driver
  has_many :wheels
end

これらは、宣言中にクラス自体で呼び出されるメソッドの例です。これは、そのパラメータのいずれかが実行時ではなく読み込み時に評価されることを意味します。

さらに例を見てみましょう。engineあなたがのために使用するために与えたいなら、acts_as_combustion_machineあなたは多分次のようなことをするでしょう:

acts_as_combustion_machine Engine.first

これはクラスのロード時に評価されることを考慮に入れてください(日付と同じ)。

この理由をもう少し明確にするのに役立つと思います...しかし、他に質問がある場合は、遠慮なく質問してください。これを自分で理解するのに少し時間がかかりました;)

于 2012-02-21T18:43:06.423 に答える