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

  前面了解了检索思路方法这次来看看Active Record怎样更新数据库中记录   如果你有个Active Record对象(或许对应于order表),你可以通过save思路方法将它写道数据库中去如果这个对象是先前从数据库中读取出来save思路方法将会更新既有记录否则将会新建条记录

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

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_allupdate思路方法使用个id和组属性如果在数据库中对应记录就更新指定属性然后返回model对象

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

  也可以传递组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:

order.save
# all OK

# validation failed
end


  这样会导致你在所有save思路方法地方都要加上检查但是Active Record假定save思路方法是在ControlerAction上下文中并且视图里代码不进行这些检查(这部分书上看不明白不能确定)

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

begin
order.save!
rescue RecordInvalid => error
# validation failed
end


Tags:  rubyonrails安装 rubyforrails rubyrails rubyonrails

延伸阅读

最新评论

发表评论