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這幾個是非常常見,但滿多人又容易搞錯的方法,這就來看看有什麼差別吧!
回傳帶入的參數與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
方法會取回第一個符合條件的資料
#回傳第一個符合條件的資料
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
方法則讓我們可以得到所有符合條件的集合(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