save!>save ?

十 6th, 2011

首先比较一下两者

save!与save功能均类似于Java界的”save_or_update”
都是先验证执行SQL。不同点在于,如果验证或保存失败,save会返回false,而save!会抛出异常。

有人觉得Save!很烦,抛出异常如果不处理就会跳到错误页面,甚至建议把save!和create!从Rails中移除。研究了一下,他们两者都有优点。
37signals 的 Pratik Naik有一篇文章(http://m.onkey.org/save-save)专门说了这个问题。
他强烈建议在有些情况下用save!
比如model中的一段代码

def do_something
  self.foo = 'bar'
  save
end

def create_items
  names.each {|n| self.items.create :name => n }
end

以上代码一般不会出问题。但万一出了问题,你也很难发现,这就可能会隐藏一些BUG,所以这种情况下最好用save!。

def do_something
  self.foo = 'bar'
  save!
end

def create_items
  names.each {|n| self.items.create! :name => n }
end

我觉得很多时候save和save!都可以用,只要代码兼顾到操作失败即可。两者写法略有不同。
使用save!时,

def create
  @user = User.new params[:user]
  begin
    @user.save!
    redirect_to @user
  rescue ActiveRecord::RecordNotSaved
    flash.now[:notice] = 'Unable to create user'
    render :new
  end
end

不带!,改用if…else…。推荐使用这种方法。

def create
  @user = User.new params[:user]
  if @user.save
    redirect_to @user
  else
    flash.now[:notice] = 'Unable to create user'
    render :new
  end
end

另外,在test中建议多用save!,create!并省略异常处理。这样可以提高效率。

>>原创文章,欢迎转载。转载请注明:转载自Ruby迷,谢谢!
>>原文链接地址:save!>save ?
  1. PikachuEXE
    十一 30th, 201110:30

    Exception处理起上来比较贵吧…
    不过这是我.NET的知识,不知Ruby是否适用…
    不过为啥要移除= =

    • 老宋
      十一 30th, 201110:48

      异常处理涉及逻辑比较多,处理花费更多,会影响一些性能。
      异常本来就是特殊情况,不会经常发生,所以我觉得性能影响可以忽略,这里主要考虑开发效率。