领域

范围充当 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。但是,类方法没有这样的安全网,如果返回其他内容,就会破坏可链接性。