ActiveRecord 提供多種更新資料的方式,適用於不同情境。
save / save!save → UPDATE 現有記錄save → INSERT 新記錄order = Order.find(123) order.name = "Fred" order.save
僅選取部分欄位的物件(如 find_by_sql),儲存時只更新該欄位,但必須包含 id。
order = Order.find(123) order.update_attribute(:name, "Barney") order = Order.find(321) order.update_attributes(:name => "Barney", :email => "barney@bedrock.com")
# 依主鍵更新單筆,回傳模型
order = Order.update(12, :name => "Barney", :email => "barney@bedrock.com")
# 批次更新多筆,回傳模型陣列
Order.update([1,2,3], [{:name => "A"}, {:name => "B"}, {:name => "C"}])
# 條件更新,回傳受影響筆數(視適配器)
result = Product.update_all("price = 1.1*price", "title like '%Java%'")
save vs save!| 方法 | 失敗時行為 | 適用場景 |
|---|---|---|
save | 回傳 false,需自行檢查 errors | Controller action 內,配合 view 顯示錯誤 |
save! | 拋出 ActiveRecord::RecordInvalid 異常 | 需確保儲存成功的腳本、任務、測試 |
# save 用法 if order.save # 成功 else # 驗證失敗處理 end # save! 用法 begin order.save! rescue ActiveRecord::RecordInvalid => error # 驗證失敗處理 end