在 ActiveRecord 中,所有查询构建方法(例如where
, order
, joins
, limit
等等)返回一个所谓的scope。仅当您调用类似的踢脚方法时all
or first
执行构建的查询并返回数据库的结果。
The scoped
类方法还返回一个范围。默认情况下,返回的范围为空,这意味着结果集不会受到任何限制,这意味着如果执行查询,将返回所有记录。
您可以使用它来提供“空”替代方案,如按日期查询MurifoX 的示例。
或者您可以使用它将多个条件组合到一个方法调用中,例如:
Model.scoped(:conditions => 'id < 100', :limit => 10, :order => 'title ASC')
# which would be equivalent to
Model.where('id < 100').limit(10).order('title ASC')
The 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 http://guides.rubyonrails.org/active_record_querying.html