保存事务失败后的rails对象

时间:2010-02-21 06:54:28

标签: ruby-on-rails validation transactions

我有一个交易,以确保同时保存两个模型。

begin 
  Recipe.transaction do
    @recipe.save!
    if @dish
      @dish.save!
    end
  end
rescue

  #save failed
  flash[:notice] = "recipe.saved = #{@recipe.new_record?}"
  render 'form'
else
  #save worked
  flash[:notice] = 'Recipe added.'
  redirect_to(@recipe)
end

当其中一个模型的验证失败时,它会转到救援区,但是在救援区中,它表示该模型不是新记录。我期待验证导致事务失败,从而将模型对象留作新记录?我在这里失踪了什么?

3 个答案:

答案 0 :(得分:5)

两次保存中的哪一次实际上失败了? @recipe@dish

的那个

交易由您的DBMS处理。例如,当@dish无法保存时,@recipe可能已经保存,但会被DBMS还原。但是,这发生在Rails的后面,因此它不会还原@recipe对象的状态。

答案 1 :(得分:4)

来自Rails文档:

  

异常会强制ROLLBACK   将数据库返回到状态   在交易开始之前。是   但是,我知道对象会   返回其实例数据   到他们的交易前状态。

http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

答案 2 :(得分:0)

我非常确定最外面的交易将适用于其中的所有内容 - 所以在这种情况下,如果保存菜失败,配方的创建也将被回滚。

也许你没有使用InnoDB表? MyISAM不支持交易。