2012-10-30 100 views
2

我是新来的ActiveRecord事务。在下面的代码中,第一个update_attributes会导致警告:无法批量分配受保护的属性:account_type_cdx,这没关系。但我很惊讶下一行self.update_attributes!(:purchased => true)被执行并存储在数据库中。由于第一个失败,我期待它能够回滚。ActiveRecord事务不会回滚

我必须缺少一些东西... 任何提示?

def complete_purchase(current_user_id, plan_name) 
    Rails.logger.debug "COMPLETE PURCHASE" 
    user = User.find(current_user_id) 
    ActiveRecord::Base.transaction do 
     user.update_attributes!(:account_type_cdx => plan_name.to_sym) 
     self.update_attributes!(:purchased => true) 
    end 
end 

我跟着这个职位的建议:http://markdaggett.com/blog/2011/12/01/transactions-in-rails/

感谢。

回答

2

Rails 忽略那些未在attr_accessible类调​​用中明确列出的记录(因此为第一次更新警告)。它不会使交易失败,这就是为什么你要达成(并完成)第二个update_attributes!一般。

+0

嗨,感谢您的解释! – Pod

+0

很高兴知道。但是如何捕捉警告并触发回滚?我想不出一个我希望保存记录的一部分的情况,所以不知道为什么这种行为是常态。 – JosephK