2012-02-21 6 views
1

あなたはActiveRecordのスコープに現在の日付を評価しようとした場合、アプリケーションのコードが代わりにロードされるとき、それは可能性が高いため、これが評価されることに不正確になります実行時にあなたはこのように、ラムダでこれを通過する必要があります発生した時間への変換があるからファンキーな例である(すなわち:ActiveRecordのスコープなど)

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

を。とにかく、私の質問はですが、それ以外はどこですか? ActiveRecordスコープは、実行時に評価されないDateへの呼び出しをカウントできる唯一の場所ですか?

答えて

2

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

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

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

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

はのは、さらに別の例を見てみましょう。あなたのようなacts_as_combustion_machineあなたが多分やるだろう何かに使用するengineを与えたいと思った場合:

acts_as_combustion_machine Engine.first 

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

は、私はそれはあなたがもう少しその理由を明確にすることができます推測する...しかし、他の質問かどうか尋ねることを躊躇しないでください。これは、この自分自身を理解することは私に少しかかりました;)

+0

優れた答えをありがとう。私の即時の尋ねのモチベーションは、同じ「スコープ内の日付」の間違いが私の検証で起こらないようにしました。たとえば、Validateブロック内でDate.todayを使用します。検証はActiveRecordオブジェクトのライフサイクルで実行時に評価されるため、これは問題ではないようです。 – Blastula

関連する問題