在rails中有多種方法可以去查詢我們要的record,今天就來分別探討最常見的三種方法。
找出單一筆資料,且只能透過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
找出單一筆資料,且可以透過自訂條件去搜尋。
找出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
而是可以捕捉的例外訊息了。
找出多筆資料,且可以透過自訂條件去搜尋,即代表了 SQL 語法 WHERE 的部分。
條件可以是字串、陣列、或是 Hash。
如果我們要找的 orders_count 不是固定的值,則帶入變數params[:orders]
:
Client.where("orders_count = ?", params[:orders])
根據Rails API文件:
直接將變數插入條件字串裡,不論變數是什麼,都會直接存到資料庫裡。這表示從惡意使用者傳來的變數,會直接存到資料庫。這麼做是把資料庫放在風險裡不管啊!一旦有人知道,可以隨意將任何字串插入資料庫裡,就可以做任何想做的事。
找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/