领域
范围充当 ActiveRecord
模型的预定义过滤器。
使用 scope
类方法定义范围。
举个简单的例子,我们将使用以下模型:
class Person < ActiveRecord::Base
#attribute :first_name, :string
#attribute :last_name, :string
#attribute :age, :integer
# define a scope to get all people under 17
scope :minors, -> { where(age: 0..17) }
# define a scope to search a person by last name
scope :with_last_name, ->(name) { where(last_name: name) }
end
范围可以直接从模型类调用:
minors = Person.minors
范围可以链接:
peters_children = Person.minors.with_last_name('Peters')
where
方法和其他查询类型方法也可以链接:
mary_smith = Person.with_last_name('Smith').where(first_name: 'Mary')
在幕后,范围只是标准类方法的语法糖。例如,这些方法在功能上是相同的:
scope :with_last_name, ->(name) { where(name: name) }
# This ^ is the same as this:
def self.with_last_name(name)
where(name: name)
end
默认范围
在模型中为模型上的所有操作设置默认范围。
scope
方法和类方法之间有一个显着的区别:scope
定义的范围将始终返回ActiveRecord::Relation
,即使内部逻辑返回 nil。但是,类方法没有这样的安全网,如果返回其他内容,就会破坏可链接性。