iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
0
Modern Web

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

Ruby on Rails面試題挑戰 Day20 - ActiveRecord中的find、find_by和where方法的差異在哪?

What is the difference between find, find_by, and where in ActiveRecord?
ActiveRecord中的find、find_by和where方法的差異在哪?


繼續來談Active Record相關的面試題目,上一篇提到delete與detroy的差異,另外一個大家很常使用的就是有關ActiveRecord中提供基本CRUD的Read,就是資料查詢有關的方法,find、find_by、where這幾個是非常常見,但滿多人又容易搞錯的方法,這就來看看有什麼差別吧!

find方法

回傳帶入的參數與primary key(流水編號id)相同的資料。

# 找到primary key(id)是3的user
user = User.find(3)
# => #<User id: 10, first_name: "Leo">

Model會幫我們翻譯成以下的SQL語法

SELECT * FROM users WHERE (users.id = 10) LIMIT 1

特別注意的是,find方法如果沒有找到對應的資料,會噴出錯誤ActiveRecord::RecordNotFound

find_by方法

find_by方法會取回第一個符合條件的資料

#回傳第一個符合條件的資料
User.find_by(first_name: 'Leo')
# => #<User id: 3, first_name: "Leo">
 
#如果沒有對應的資料會回傳nil 
User.find_by(first_name: 'Jon')
# => nil

Model同樣會幫我們翻譯成SQL語法

SELECT * FROM users WHERE (users.first_name = 'Leo') LIMIT 1

where方法

where方法則讓我們可以得到所有符合條件的集合(collection),如果沒有符合的資料則會會傳空的集合

#找出所有符合名字是"David"的user且照created_at的時間降序排列
users = User.where(first_name: 'Leo').order(created_at: :desc)

上面的where會找出所有符合條件的集合,而後面的order方法可以決定排列的方式,:desc表示降序(Descending)排列

會幫我們翻譯成下面的SQL語法

SELECT * FROM "users" WHERE (users.first_name = 'Leo') ORDER BY created_at DESC 

以下做個小總結。

你可以這樣回答:

  • find接收單一參數,會回傳帶入的參數與primary key(流水編號id)相同的資料,沒找到會噴錯
  • find_by接收參數為條件(通常是hash),會回傳符合條件的第一筆資料,沒有符合條件的資料會回傳nil
  • where接收參數為條件,會回傳所有符合條件資料的集合,沒有符合條件的資料則會回傳空集合

參考資料

1.Rubyguide-ActiveRecord Basics

2.Active Record Query Interface

3.Class: ActiveRecord::QueryMethods

4.53 Ruby on Rails Interview Questions and Answers


上一篇
Ruby on Rails面試題挑戰 Day19 - delete與destroy差異在哪?
下一篇
Ruby on Rails面試題挑戰 Day21 - 什麼是scope?
系列文
Ruby on Rails面試題挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言