在Rails中命名范围的意义是什么?

时间:2010-05-27 09:00:37

标签: ruby-on-rails named-scope

在详细说明之前。

问题1: - 此处范围的含义是什么(即名为**范围)?**

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

现在: -

来自Agile Development with Rails的书: -

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

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

这样一个命名的范围将使找到上周的订单价值a 卡扣。

   orders = Orders.last_n_days(7)

范围也可以合并

orders = Orders.checks.last_n_days(7)

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

3 个答案:

答案 0 :(得分: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. 202 Active Record Queries in Rails 3(rails 3中的一些基础知识)
  3. 215 Advanced Queries in Rails 3(rails 3中的一些高级主题)

答案 1 :(得分:2)

named_scope对2个案例非常有用

更好的可读性

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

<强>链接

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

您可以动态生成链。

答案 2 :(得分:2)

范围仅表示某些选定范围。所以如果你使用:

orders = Orders.checks.last_n_days(7)

然后,您只想从订单中选择通过支票付款且在过去7天内的订单。所以你'范围'订单。

  

为什么不使用方法?

命名范围是方法。这只是一种更简单的定义方式,所以你不必关心所有的细节,你可以很乐意使用它!

请记住,范围只是为sql查询添加了一些条件(以及其他内容)。