• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Ruby on rails开发从头来(五十)- ActiveRecord基础(更新记录)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
      前面了解了检索的方法,这次来看看Active Record怎样更新数据库中的记录。

    如果你有一个Active Record对象(或许对应于order表),你可以通过调用save方法将它写道数据库中去,如果这个对象是先前从数据库中读取出来的,save方法将会更新既有的记录,否则将会新建一条记录。

    如果一条既有记录被更新,Active Record将会用它的主键和来匹配内存中的对象,Active Record对象中的属性被更新到对应的列,即使一个列中的值没有变化也会被更新,在下面的例子中,id123的订单所有的内容都会被更新:

order = Order.find(123)

order.name = "Fred"

order.save

    不管怎样,在下面的例子里,Active Record对象只包含idnamepaytype,当对象被保存的时候仅仅只有这些字段被更新,注意如果你想要把对象保存到数据库,那么在使用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 => "[email protected]")

    我们可以把读取和更新结合在一起,使用update()方法或update_all()update()方法使用一个id和一组属性,如果在数据库中对应的记录,就更新指定的属性,然后返回model对象。

order = Order.update(12, :name => "Barney", :email => "[email protected]")

也可以传递一组id或者属性和值的hashupdate()方法,这样会更新所有匹配的记录,并且返回一组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方法是在ControlerAction的上下文中的,并且视图里的代码不进行这些检查。(这部分书上看不明白,不能确定)。

不管怎样,如果你需要在上下文环境中保存Model对象,并且想确定是否所有的错误都被处理了,你可以使用save!()方法,如果Model对象不能保存,那么这个方法会抛出一个RecordInvailid异常:

begin

order.save!

rescue RecordInvalid => error

# validation failed

end

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Cygwin中通过RJB在Ruby下调用ICTCLAS(JAVA)发布时间:2022-07-13
下一篇:
.nil?.empty?.blank?.present?inRubyonRails发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap