前言
我們可以通過使用update,update_columns,update_all,update_attribute來修改數據庫中的資料
一、使用update_columns
- 查看一筆資料
p=Product.first
可以看出,該筆資料的description欄位的內容為空
接下來,更新description內容
- 更新該筆資料的description欄位中的內容
p.update_columns(description: "好吃")
p.save
-
查看更新后的該筆資料內容
006tKfTcgy1fj1munn0zlj312w04ydhl.jpg
可以看出,description欄位中的內容更新為"好吃"
使用update_columns方法時,其實并不需要額外使用save方法,就可以將數據庫中的資料自動保存為修改后的數據。所以用不用save沒有關系
使用update_columns方法,可以同時更新資料庫中多個欄位的資料,比如:
p=Product.first
p.update_columns(title: "紅樹莓1",description: "酸甜可口")
p
可以看出,可以看出該筆資料的title和description內容都修改了.
二、使用update
- 查看一筆資料
p=Product.first
- 更新該筆資料的description欄位中的內容
p.update(description: "好吃")
p.save
- 查看更新后的該筆資料內容
可以看出,description欄位中的內容從"好吃"更新為"非常好吃"
使用update方法時,其實并不需要額外使用save方法,就可以將數據庫中的資料自動保存為修改后的數據。所以用不用save沒有關系
使用update方法,可以同時更新資料庫中多個欄位的資料,比如:
p=Product.first
p.update(quantity: 50,price: 100)
p
可以看出該筆資料的quantity和price內容都修改了.
三、update_attribute
update_attribute的寫法有所不同,一次只能修改一個欄位的內容
p= Product.first
p.update_attribute(:title, "草莓")
四、update_all
update_all()則是對類的操作,它會跳過驗證和回調直接生成sql,并更改數據表的整列數據。
使用update_all可以對一列數據進行修改,也可以對多列數據進行修改;
(1)對一列數據修改
Product.update_all(:price => 100, :quantity => 99)
Product.update_all(price: 100, :quantity: 99)
Product.update_all("price => 100, quantity = 99")
三種寫法是等價的,都可以將所有的product的price設置為100,quantity設置為99
另外,你可以搭配查詢語句,只修改滿足條件的資料的欄位,比如:
Product.where(:title =>"藍莓").update_all("price = 300, quantity = 199")
它會將所有title為"藍莓"的資料撈出來,并且將它們的price全部設置為300,quantity全部設置為199
補充:
1.update(), update_columns()和update_attribute()都是修改數據,并且功能類似,不同點在于:
- update_column(s)直接生成sql操作數據庫,跳過驗證和回調.
- update_attribute()只是跳過驗證,但是依然會回調函數
- update()則驗證和回調都會執行
值得一提的是,使用update,update_attribute等方法,由于它們會執行回調函數,因此如果它們和循環體組合在一起時,一定要有跳出循環的條件,否則就陷入了死循環。
2.對于update(), update_columns()和update_attribute(),你可以搭配查詢語句,只修改滿足條件的資料的欄位