2011-12-26 11 views

答えて

7

scope :min_2_items_last_90_days, where(...) 

としてそれを書いている間は非常にあなたが何を考えて行っていない、それはおそらく(元のコードのように)、構文的に正しいです。

どちらの場合でも、90.days.agoはクラスが読み込まれると1回だけ評価されるため、アプリを最後に再起動するまでの90日間は常に90日間になります。アプリを10日間再起動していない場合は、過去100日間に作成されたものが実際に表示されます。ソースコードが継続的にリロードされているため(つまり、90.daysが再評価されているため)、開発中にこれに気付かないでしょう。

代わりに、条件は、あなたがスコープを使用するたびに再評価されることを保証する

scope :min_2_items_last_90_days, lambda { where('orders.created_at >= ?', 90.days.ago).includes(...) ... } 

を行う必要があります。

2
scope :min_2_items_last_90_days, lambda { where('orders.created_at >= ?', 90.days.ago).includes(:orders => :order_items).group('people.id').having('COUNT(order_items.id) >= 2') } 

NB(それは忘れることは簡単ですので):ラムダを使用すると、条件が毎回再評価されることが保証されますスコープが呼び出されます(docs on scopeも参照してください)。そして、90.days.agoの式 - のためにここで再評価が必要です。範囲を呼び出すたびに90.days.agoを評価してください。ラムダがなければ、再評価は行われず、90.days.ago式はサーバーの起動時に評価されます(のみ)。