save!>save ?
首先比较一下两者
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!并省略异常处理。这样可以提高效率。
Exception处理起上来比较贵吧…
不过这是我.NET的知识,不知Ruby是否适用…
不过为啥要移除= =
异常处理涉及逻辑比较多,处理花费更多,会影响一些性能。
异常本来就是特殊情况,不会经常发生,所以我觉得性能影响可以忽略,这里主要考虑开发效率。