谁能解释一下这个方法是做什么的,我可以传递给它什么?
scoped(options = nil)
Returns an anonymous scope.还有,scope方法做了什么?在看完文档后,我不明白。
发布于 2012-08-10 20:49:27
在ActiveRecord中,所有查询构建方法(如where、order、joins、limit等)都返回一个所谓的作用域。只有当您调用all或first之类的kicker方法时,才会执行构建的查询并返回数据库的结果。
scoped类方法还返回一个作用域。默认情况下,返回的作用域为空,这意味着结果集不会受到任何限制,这意味着如果执行查询,则会返回所有记录。您可以使用它来提供一个“空”的替代方案,就像MurifoX的query_by_date示例中那样。或者您可以使用它将多个条件组合到一个方法调用中,例如:
Model.scoped(:conditions => 'id < 100', :limit => 10, :order => 'title ASC')
# which would be equivalent to
Model.where('id < 100').limit(10).order('title ASC')scope类方法允许您定义也返回作用域的类方法,例如:
class Model
scope :colored, lambda {|col|
where(:color => col)
}
end它可以像这样使用:
Model.colored作用域的好处是您可以(几乎)按照自己的意愿将它们组合在一起,因此以下操作是完全可能的:
Model.red.where('id < 100').order('title ASC').scoped(:limit => 10)我也强烈建议通过http://guides.rubyonrails.org/active_record_querying.html阅读
发布于 2012-08-10 19:51:09
我在对ActiveRecord查询接口进行链式调用的past.When中使用了它,如下所示:
Model.where(:conditions).where(:more_conditions).where(:final_conditions)它们中的每一个都已经被限定了作用域,使得链工作起来没有任何问题。但是假设你有这样的东西:
Model.query_by_date(date).query_by_user(user).query_by_status(status)
scope :query_by_date, lambda { |date|
case date
when "today"
where(:date => Date.today)
when "tomorrow"
where(:date => Date.tomorrow)
else
# Any value like '' or 0 or Date.whatever
end
}如果日期参数不是今天或明天,这将导致错误。它将选取最后一个值,并尝试将该查询与下一个query_by_user链接起来,从而产生一个undefined method default_scoped? for ''。但是如果你把一个scoped方法放在else条件中,它将没有任何缺陷,因为你告诉activerecord你通过这个方法/命名作用域传递,没有对where/find/other activerecord methods进行任何调用,但返回了一个作用域对象,所以你可以继续链接查询和其他东西。
最终会是这样的。
else
scoped
end希望你能理解这个简单的例子。
https://stackoverflow.com/questions/11900062
复制相似问题