6

嗨,我目前正在阅读 Rails 食谱,其中有一节作者在模型中使用范围,以便控制器可以访问某些查询片段而无需向控制器添加查询(因此违反了 MVC 规则)。在某一时刻,他有这个:

class Wombat < ActiveRecord::Base
  scope :with_bio_containing, lambda {|query| where("bio like ?", "%#{query}%").
                                         order(:age) }
end

我从未使用过 lambda 和 Proc 对象。这是否等同于向范围添加参数,以便从概念上讲它是scope :with_bio_containing(query)允许我自定义范围,就好像它是一个函数一样?lambda 是否常用于 Rails 的范围?

4

2 回答 2

14

从概念上讲,你是对的。这就像发送一个论点。你可以这样称呼这个特定的范围:

Wombat.with_bio_containing("born in Canada")

您可以创建一个包含许多参数的范围:

# code
scope :with_name_and_age, lambda { |name, age| where(:name => name, :age => age) }

# call
Wombat.with_name_and_age("Joey", 14)

你也可以没有参数:

# code
scope :from_canada, lambda { where(:country => "Canada") }

# call
Wombat.from_canada

是的,根据我自己的经验,通常使用 lambdas。

于 2012-11-21T19:15:27.740 回答
0

两个问题都是。

Wombat.with_bio_lining('foo') 在运行时被评估为:

select * from wombats where bio like "%foo%" order by age
于 2012-11-21T19:14:40.330 回答