前言
我们可以通过使用update,update_columns,update_all,update_attribute来修改数据库中的资料
一、使用update_columns
- 查看一笔资料
p=Product.first
可以看出,该笔资料的description栏位的内容为空
接下来,更新description内容
- 更新该笔资料的description栏位中的内容
p.update_columns(description: "好吃")
p.save
-
查看更新后的该笔资料内容
可以看出,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(),你可以搭配查询语句,只修改满足条件的资料的栏位