【问题标题】:Using a transaction to roll back saves使用事务回滚保存
【发布时间】:2015-12-22 21:41:37
【问题描述】:

我的注册表复杂而脆弱。我正在尝试使用事务,但它似乎不像我认为的那样工作。

我的目的是在出现故障时回滚所有保存。我这样做不正确吗?

if @little_class_schedule.valid?
  User.transaction do
    if @user.save
      @little_class.user_id = @user.id
      if @little_class.save
        if @location.save
          if little_class_schedule_form_params["schedule_type"].to_i == 2 || @little_class_schedule.save
            if @little_class_session_validation.valid?
              sessions.each do |s|
                if s.save
                  next
                else
                  raise ActiveRecord::Rollback
                  render 'class_account_registration/new'
                end
              end
              ApprovalMailer.request_approval(@user, @little_class).deliver
              redirect_to dashboard_path, notice: 'Success!'
            else
              raise ActiveRecord::Rollback
              render 'class_account_registration/new'
            end
          else
            raise ActiveRecord::Rollback
            render 'class_account_registration/new'
          end
        else
          raise ActiveRecord::Rollback
          render 'class_account_registration/new'
        end
      else
        raise ActiveRecord::Rollback
        render 'class_account_registration/new'
      end
    else
      render 'class_account_registration/new'
    end
  end
else 
  render 'class_account_registration/new'
end

【问题讨论】:

  • 我认为最好从用户那里获取您需要的所有信息,对其进行验证,然后再保存。

标签: ruby-on-rails transactions


【解决方案1】:

我强烈建议您在代码中获取结构并保持干燥!

因为我不知道你想做什么,所以我只是改进了你的代码。它仍然不是最好的解决方案,但是由于我不知道您真正想做什么,所以我无法更改逻辑。

successful = false

if @little_class_schedule.valid?
    User.transaction do
        if @user.save
            @little_class.user_id = @user.id

            if @little_class.save && @location.save
                if little_class_schedule_form_params["schedule_type"].to_i == 2 || @little_class_schedule.save
                    if @little_class_session_validation.valid?
                        sessions.each do |s|
                            if s.save
                                next
                            else
                                raise ActiveRecord::Rollback
                            end
                        end

                        successful = true
                    end
                end
            end
        end

        unless successful
            raise ActiveRecord::Rollback
        end
    end
end

if successful
    ApprovalMailer.request_approval(@user, @little_class).deliver_now
    redirect_to dashboard_path, notice: 'Success!'
else
    render 'class_account_registration/new' unless successful
end

我没有测试过这段代码,所以它可能有错误。请尝试一下,如果它有效,或者如果不是您有什么错误,请给我们反馈。

希望这会有所帮助!

编码愉快:)

【讨论】:

    猜你喜欢
    • 2016-04-16
    • 1970-01-01
    • 2015-04-23
    • 2012-07-13
    • 2013-12-10
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多