首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 3.1 named_scope

Rails 3.1 named_scope
EN

Stack Overflow用户
提问于 2011-12-27 01:51:32
回答 2查看 1.7K关注 0票数 4

编写以下代码的Rails 3.1是什么:

代码语言:javascript
复制
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'
  }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-27 02:11:55

我把它写成

代码语言:javascript
复制
scope :min_2_items_last_90_days, where(...)

在语法上是正确的,它可能(就像你的原始代码一样)并不完全像你所想的那样。

在这两种情况下,90.days.ago仅在类加载时评估一次,因此90天将始终是应用程序上次重启前的90天。如果你有10天没有重启你的应用程序,你实际上是在查看过去100天内创建的东西。在开发中您不会注意到这一点,因为您的源代码不断地被重新加载(因此90.days也被重新计算)。

相反,你应该这样做

代码语言:javascript
复制
scope :min_2_items_last_90_days, lambda { where('orders.created_at >= ?', 90.days.ago).includes(...) ... }

这确保了每次使用作用域时都会重新评估条件。

票数 7
EN

Stack Overflow用户

发布于 2011-12-27 01:59:25

代码语言:javascript
复制
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') }

lambda NB(因为很容易忘记):使用确保每次调用作用域时都会重新计算条件(另请参阅)。这里需要重新求值,因为每次作用域被称为时,您最终都希望对90.days.ago 进行表达式-。如果没有lambda,将不会发生重新计算,并且90.days.ago表达式将(仅)在服务器启动时进行计算。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8637954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档