iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 24
0
自我挑戰組

非本科之30天Ruby / Rails學習筆記系列 第 24

Day24: Rails中的find? find_by? where?

  • 分享至 

  • xImage
  •  

在rails中有多種方法可以去查詢我們要的record,今天就來分別探討最常見的三種方法。

find

找出單一筆資料,且只能透過id去搜尋。

#找出id為1的購物車
Cart.find(1)

對應的SQL:

Cart Load (0.4ms)  SELECT  "carts".* FROM "carts" WHERE "carts"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]

如果查詢不到該筆資料,就會回傳一個ActiveRecord::RecordNotFound的例外訊息,還記得之前的文章有提過例外處理的方法嗎?

這時候就可以用begin..rescue來捕捉:

 def find_cart
    begin
      @cart = Cart.find(params[:id])
    rescue
      redirect_to carts_path, notice: "沒有這台購物車喔"
    end
  end

如果找不到cart的話,就會直接執行rescue下的程式碼。

若要找多筆資料又堅持用find,find()裡面還可以塞陣列:

products = Product.find([2, 5])      # 等同於 Client.find(2, 5)

#找id是2跟id是5的product

find_by

找出單一筆資料,且可以透過自訂條件去搜尋。

找出id為5的食物:

Food.find_by(id: 5)

#等同於Food.find(5)

對應的SQL:

Food Load (0.4ms)  SELECT  "foods".* FROM "foods" WHERE "foods"."id" = $1 LIMIT $2  [["id", 5], ["LIMIT", 1]]

找id是2的使用者擁有的食物:

Food.find_by(user_id: 2)

對應的SQL:

Food Load (0.2ms)  SELECT  "foods".* FROM "foods" WHERE "foods"."user_id" = $1 LIMIT $2  [["user_id", 2], ["LIMIT", 1]]

這裡可以注意的是,如果找不到該筆資料的話,find_by方法會回傳的值是nil而不是例外訊息。

若使用find_by方法撈資料但還是想要有回傳ActiveRecord::RecordNotFound,可以在find_by後面加個驚嘆號!

就可以看到回傳的值不是nil而是可以捕捉的例外訊息了。

where

找出多筆資料,且可以透過自訂條件去搜尋,即代表了 SQL 語法 WHERE 的部分。

條件可以是字串陣列、或是 Hash

陣列

如果我們要找的 orders_count 不是固定的值,則帶入變數params[:orders]

Client.where("orders_count = ?", params[:orders])

根據Rails API文件:

直接將變數插入條件字串裡,不論變數是什麼,都會直接存到資料庫裡。這表示從惡意使用者傳來的變數,會直接存到資料庫。這麼做是把資料庫放在風險裡不管啊!一旦有人知道,可以隨意將任何字串插入資料庫裡,就可以做任何想做的事。

絕對不要直接將變數插入條件字串裡。

Hash

找id是2的使用者全部擁有的食物:

Food.where(user_id: 10)

對應的SQL:

Food Load (0.4ms)  SELECT "foods".* FROM "foods" WHERE "foods"."user_id" = $1  [["user_id", 10]]

若找不到該筆資料,則會回傳#<ActiveRecord::Relation []>

參考資料:
JD store find/find_by/where in Rails
Active Record 查詢
[Rails] Active Record Query(SQL Query)
Model 基本操作

“Most of our obstacles would melt away if instead of cowering before them we should make up our minds to walk boldly through them.”

— Orison Marden, Writer

本文同步發佈於: https://louiswuyj.tw/


上一篇
Day23: Rails中的N+1問題
下一篇
Day25: Rails中的一球冰淇淋 scope
系列文
非本科之30天Ruby / Rails學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言