iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
0
Modern Web

Ruby on Rails面試題挑戰系列 第 21

Ruby on Rails面試題挑戰 Day21 - 什麼是scope?

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


上一篇
Ruby on Rails面試題挑戰 Day20 - ActiveRecord中的find、find_by和where方法的差異在哪?
下一篇
Ruby on Rails面試題挑戰 Day22 - count、length和size的差異?
系列文
Ruby on Rails面試題挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言