Ruby on rails开发从头来(五十)- ActiveRecord基础(更新记录)
来源:互联网 发布:手环值得买吗 知乎 编辑:程序博客网 时间:2024/05/17 01:26
如果你有一个Active Record对象(或许对应于order表),你可以通过调用save方法将它写道数据库中去,如果这个对象是先前从数据库中读取出来的,save方法将会更新既有的记录,否则将会新建一条记录。
如果一条既有记录被更新,Active Record将会用它的主键和来匹配内存中的对象,Active Record对象中的属性被更新到对应的列,即使一个列中的值没有变化也会被更新,在下面的例子中,id为123的订单所有的内容都会被更新:
order = Order.find(123)
order.name = "Fred"
order.save
不管怎样,在下面的例子里,Active Record对象只包含id,name,paytype,当对象被保存的时候仅仅只有这些字段被更新,注意如果你想要把对象保存到数据库,那么在使用find_by_sql方法时,一定要包含id字段。
orders = Order.find_by_sql("select id, name, pay_type from orders where id=123")
first = orders[0]
first.name = "Wilma"
first.save
另外,Active Record还提供了update_attribute()方法,该方法可以将Model对象的某个属性保存到数据库。
order = Order.find(123)
order.update_attribute(:name, "Barney")
order = Order.find(321)
order.update_attributes(:name => "Barney",
:email => "barney@bedrock.com")
我们可以把读取和更新结合在一起,使用update()方法或update_all(),update()方法使用一个id和一组属性,如果在数据库中对应的记录,就更新指定的属性,然后返回model对象。
order = Order.update(12, :name => "Barney", :email => "barney@bedrock.com")
也可以传递一组id或者属性和值的hash给update()方法,这样会更新所有匹配的记录,并且返回一组model对象。
最后,update_all()方法允许你指定给update语句指定Where条件,下面的例子给所有标题中含有java的商品涨价10%:
result = Product.update_all("price = 1.1*price", "title like'%Java%'")
这里的返回值依赖于具体的数据库适配器,很多数据库都返回被更新的记录数目。
下面我们看看save()和save!()这两个方法。
简单的save()方法在Model对象存在并且可以的保存的情况下返回true:
if order.save
# all OK
else
# validation failed
end
这样会导致你在所有调用save方法的地方都要加上检查,但是Active Record假定save方法是在Controler的Action的上下文中的,并且视图里的代码不进行这些检查。(这部分书上看不明白,不能确定)。
不管怎样,如果你需要在上下文环境中保存Model对象,并且想确定是否所有的错误都被处理了,你可以使用save!()方法,如果Model对象不能保存,那么这个方法会抛出一个RecordInvailid异常:
begin
order.save!
rescue RecordInvalid => error
# validation failed
end- Ruby on rails开发从头来(五十)- ActiveRecord基础(更新记录)
- Ruby on rails开发从头来(五十)- ActiveRecord基础(更新记录)
- Ruby on rails开发从头来(三十七)- ActiveRecord基础
- Ruby on rails开发从头来(四十四)- ActiveRecord基础(创建记录)
- Ruby on rails开发从头来(四十五)- ActiveRecord基础(读取记录)
- Ruby on rails开发从头来(五十二)- ActiveRecord基础(删除记录)
- Ruby on rails开发从头来(五十九)- ActiveRecord基础(预加载子记录)
- Ruby on rails开发从头来(五十九)- ActiveRecord基础(预加载子记录)
- Ruby on rails开发从头来(五十二)- ActiveRecord基础(删除记录)
- Ruby on rails开发从头来(四十五)- ActiveRecord基础(读取记录)
- Ruby on rails开发从头来(四十四)- ActiveRecord基础(创建记录)
- Ruby on rails开发从头来(三十八)- ActiveRecord基础(列和属性)
- Ruby on rails开发从头来(三十八)- ActiveRecord基础(列和属性)
- Ruby on rails开发从头来(三十九)- ActiveRecord基础(访问属性)
- Ruby on rails开发从头来(四十)- ActiveRecord基础(Boolean属性)
- Ruby on rails开发从头来(四十一)- ActiveRecord基础(存储结构化数据)
- Ruby on rails开发从头来(四十二)- ActiveRecord基础(主键和ID)
- Ruby on rails开发从头来(四十三)- ActiveRecord基础(连接数据库)
- linux下的so、o、lo、a、la文件有什么区别?
- Framebuffer原理、使用、测试系列文章
- 页面漂浮脚本。第一个面向对象的js
- GPU在视频转码中的应用研究进展
- Ruby on rails开发从头来(五十一)- ActiveRecord基础(并发处理)
- Ruby on rails开发从头来(五十)- ActiveRecord基础(更新记录)
- Ruby on rails开发从头来(四十九)- ActiveRecord基础(行数和再加载数据)
- node.js 入门(1)
- Ruby on rails开发从头来(四十八)- ActiveRecord基础(动态查询)
- HLSL固有函数 [Intrinsic Functions (DirectX HLSL)]
- Ruby on rails开发从头来(四十七)- ActiveRecord基础(强大的find方法)
- Linux下通用线程池的构建
- DirectSound中关于IID_IDirectSound无法解析的问题
- Deverpress7.1中没有ShowCheckBox属性时的实现办法