這篇文章將會介紹在 Active Record Query,find 與 find_by 的不同之處。其實這兩種方式取出資料庫的物件是相同的

我們先檢視 find 跟 find_by 的SQL語法:


  task = Task.find(1)
# 對應的 SQL 語法會是:
  SELECT * FROM books WHERE (tasks.id = 1) LIMIT 1

  task = Took.find_by(id:1)
# 對應的 SQL 語法會是:
  SELECT * FROM tasks WHERE (books.id = 1) LIMIT 1

在 rails console 裡面

symbol1

這兩種寫法都可以取得相同的資料,不同之處在當沒找到符合條件的資料時,處理回傳值的方式有明顯的差異。

現在來試試看,沒有找到資料時會如何呈現錯誤

symbol1

在圖中可以看到 find(id) 會直接爆出錯誤訊息: ActiveRecord::RecordNotFound (Couldn’t find Task with ‘id’=100)

find_by(id: id)會比較客氣地回傳 nil 值出來,所以當你不想處理捕捉例外情況(catching exceptions)時,就要選擇 find_by(id: id)的做法。

如果你還是想要有回傳 ActiveRecord::RecordNotFound,可以在find_by後面加上驚嘆號!

symbol1