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