Rails初心者的學習筆記4:Scope

Rails初心者的學習筆記4:Scope

上次speed dating快速面試的時候,有間公司問了model裡的程式碼, 這才發現我跟scope超級不熟,趕快來裝熟一下。

scope是什麼

可以把scope當成一種把查詢條件包起來的方法。 如果有想要重複使用的條件的話,使用scope就很方便,而且可簡化程式碼。

scope的寫法

scope寫在model裡,長得像下面的樣子。

scope :old, -> { where("age > 60") }

old是方法的名稱,花括號內為查詢條件。

可傳入參數

scope :young, ->(age) { where("age < ?", age) }

//在controller裡的用法
User.young(30)

為了皇城的和諧這樣就可以隨時改變young的定義了。

merge的用法

  • 相同model下,可以直接接在後面
class Citizen < ActiveRecord::Base
  scope :old, -> { where("age > 60") }
  scope :poor, -> { where("salary < 22000") }
end

//在controller裡的用法
Citizen.old.poor
//就可以得到又老又窮的市民了(咦)
  • 不同model下,使用joins來結合
class Store < ActiveRecord::Base
  has_many :products
  scope :with_products, -> { joins(:products).merge(Product.recent) }
end

class Product < ActiveRecord::Base
  belongs_to :store
  scope :recent, -> { where(in_storage_at: Time.zone.now..3.days.ago) }
end

//在controller裡的用法
Store.with_products

default scope

使用default scope的話,則所有查詢都會預設套用這個條件,因此最好謹慎使用。

default_scope { where("deleted_at: nil") }

//在controller裡的用法
Candidate.all
//只會篩選出沒有被刪除的候選人

以上,下次再被問的話應該可以答得出來了:)

參考資料: Rails ModelのScope(スコープ)の使い方

scopeの使い方まとめ

為你自己學Ruby on Rails

Recent post