zoukankan      html  css  js  c++  java
  • Ruby on rails开发从头来(五十) ActiveRecord基础(更新记录)

          前面了解了检索的方法,这次来看看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 => "barney@bedrock.com")

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

    order = Order.update(12, :name => "Barney", :email => "barney@bedrock.com")

    也可以传递一组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
  • 相关阅读:
    hdu 1269 迷宫城堡 (并查集)
    hdu 1272 小希的迷宫 (深搜)
    hdu 1026 Ignatius and the Princess I (深搜)
    hdu 1099 Lottery
    hdu 1068 Girls and Boys (二分匹配)
    几个基础数位DP(hdu 2089,hdu 3555,uestc 1307 windy 数)
    hdu 1072 Nightmare (广搜)
    hdu 1398 Square Coins (母函数)
    hdu 1253 胜利大逃亡 (深搜)
    hdu 1115 Lifting the Stone (求重心)
  • 原文地址:https://www.cnblogs.com/dahuzizyd/p/ruby_rails_study_50.html
Copyright © 2011-2022 走看看