What’s a scope?
什麼是scope?
scope是ActiveRecord的查詢邏輯,我們可以定義在model裡面,然後其他地方都可以呼叫。
定義一個scope可以讓我們不用在許多地方都定義相同的邏輯。之後要修改查詢條件的時候也只要來一個地方更改就好。
譬如想要取得已經發佈的文章,可以寫Article.where(published:true)
這樣子的邏輯,但我們的操作常常會需要用到撈出已發佈文章再做後續操作的話,就可以定義一個scope給他:
class Article < ApplicationRecord
scope :published, -> { where(published: true) }
end
上面定義了一個scope叫做published,代替之前的寫法,之後我們只要用以下這個方法就能夠撈出所有發表的文章
Article.published
# => [published articles]
可以看得出有點像定義類別方法的感覺,實際上也真的可以這樣寫,效果基本是一樣的
class Article < ApplicationRecord
def self.published
where(published: true)
end
end
差別只在於scope
永遠會回傳ActiveRecord::Relation
的物件,而類別方法並不會,可能會回傳nil
(如果後面有接判斷式的話),有興趣的可以參考這篇文章
scope是ActiveRecord的查詢邏輯,我們可以定義在model裡面,然後相關的model和物件都可以呼叫。而定義scope的好處是不用在很多地方定義同樣的邏輯,後續要維護也相對容易。
1.Rubyguide-ActiveRecord Basics
2.Active Record Query Interface
3.為你自己學 Ruby on Rails - Model 基本操作
4.53 Ruby on Rails Interview Questions and Answers
5.Active Record scopes vs class methods