領域

範圍充當 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。但是,類方法沒有這樣的安全網,如果返回其他內容,就會破壞可連結性。