bas*_*eps 4 ruby activerecord ruby-on-rails-3.1
编写下面代码的Rails 3.1是什么:
named_scope :min_2_items_last_90_days, {
:include => { :orders => :order_items },
:conditions => ['orders.created_at >= ?', 90.days.ago],
:group => 'people.id',
:having => 'COUNT(order_items.id) >= 2'
}
Run Code Online (Sandbox Code Playgroud)
写作时
scope :min_2_items_last_90_days, where(...)
Run Code Online (Sandbox Code Playgroud)
在语法上是正确的,它可能(就像你的原始代码)没有做你想象的那么多.
在这两种情况下,90.days.ago仅在加载类时评估一次,因此在上次重新启动应用程序之前90天将始终为90天.如果您没有重新启动应用程序10天,那么您实际上会查看过去100天内创建的内容.您不会在开发中注意到这一点,因为您的源代码会不断被重新加载(因此90.days会重新评估).
相反,你应该这样做
scope :min_2_items_last_90_days, lambda { where('orders.created_at >= ?', 90.days.ago).includes(...) ... }
Run Code Online (Sandbox Code Playgroud)
这确保了每次使用示波器时都会重新评估条件.