2

在了解详细信息之前。

问题1:--这里的scope是什么意思(即命名为**scope)?**

使用命名范围有什么好处?

现在:-

来自使用 Rails 的敏捷开发一书:-

class Order < ActiveRecord::Base
   named_scope :last_n_days, lambda { |days| {:conditions =>
  ['updated < ?' , days] } }

 named_scope :checks, :conditions => {:pay_type => :check}
end

这样一个命名范围将使找到上周的订单价值变得轻而易举。

   orders = Orders.last_n_days(7)

范围也可以组合

orders = Orders.checks.last_n_days(7)

为什么我们在这里使用 named_scope。我们可以使用方法来做同样的事情。我们使用 named_scope 得到了什么特别的东西。

4

3 回答 3

3

我们得到更短、可链接且更易读的代码:

orders = Orders.checks.last_n_days(7)

比可读性更强、更短且不可链接

orders = Orders.all :conditions => ["updated < ? and pay_type='check'", 7]

在 Rails3 中,优势会更大,因为arel。有关更多信息,我建议观看 Railscasts:

  1. 108 named_scope(rails 2 中的一些基础知识)
  2. Rails 3 中的 202 个 Active Record 查询(rails 3中的一些基础知识)
  3. Rails 3 中的 215 个高级查询(rails 3 中的一些高级主题)
于 2010-05-27T09:19:59.857 回答
2

named_scope 对 2 种情况非常有用

更好的可读性

使用好的named_scope,您可以更轻松地了解您真正想要搜索的内容。

链接

所有 named_scope 都可以链接。所以如果你想做一个搜索系统,很容易做到。在痛苦之前做到了。

您可以动态生成链它。

于 2010-05-27T09:17:31.217 回答
2

范围只是意味着一些选定的范围。因此,如果您使用:

orders = Orders.checks.last_n_days(7)

那么您只想从最近 7 天内用支票付款的订单中选择订单。所以你'范围'订单。

为什么不使用方法?

命名范围是方法。这只是定义它们的一种更简单的方法,因此您不必关心所有细节,并且可以愉快地使用它!

And remember that scopes are just adding some conditions (and other stuff) to sql query.

于 2010-05-27T10:22:28.680 回答