如果事务中的方法失败,则回滚所有内容

时间:2014-01-24 19:48:53

标签: ruby-on-rails activerecord ruby-on-rails-4

我有一组插入和更新,如果其中任何一个失败,都需要回滚。这些更新和插入的很大一部分被抽象出来,因此可以重复使用。当我启动一个事务,然后调用该方法启动抽象插入时,失败不会发送到原始事务块 - 它只是在该方法之前提交所有内容

    def decline_check
        Check.transaction do
            # Set default updates, then a voided date if the check has already been printed.
            check_attributes = {:status => 'Voided', :status_date => Time.now.strftime('%Y-%m-%d')}
            check_attributes[:voided_date] = Time.now.strftime('%Y-%m-%d') if check.status == "Printed"

            # Update check status
            check.update_attributes!(check_attributes)

            decline(current_user)
        end
    end

private

    def decline current_user
        # execute some insert  here that fails
    end

如何在decline中进行回滚以在decline_check中触发回滚?

1 个答案:

答案 0 :(得分:0)

如果要手动触发事务回滚,可以raise ActiveRecord::Rollback

更好的设计是在进行数据库交互之前尝试找到一种验证方法。

您在decline current_user中的评论表示插入内容将失败。如果您正在引用数据库级别故障,它应该自动触发回滚。