禁用ActiveRecord :: Base.transaction

时间:2015-06-25 08:08:51

标签: ruby-on-rails ruby postgresql activerecord service-object

我有一个FormObject用于注册,可以在create方法中为他创建一个用户和很多模型。

def create
  ActiveRecord::Base.transaction do
    @user = User.create(@params[:user])
    process_bonuses_for_user
    process_actions_for_user
    # et.c., giant amount of methods
  end

  @user.persisted? # to return the true of false to controller
end

我遇到了FormObject的奇怪行为。即使它成功运行(创建了很多模型)或不成功(不保存它们),id User模型也会自动增量。因此,每个尝试使用FormObject保存内容的人都会为User增加下一个id的值。这是User成功创建时的正常情况,但是当用户在注册表单上出错时不正常。

如何禁用这种不可预测的行为?

P.S。我知道当我在@user = User.new(@params[:user])方法的开头create和最后@user.save处写autosave时一切正常,但有很多关联,我不想要在我的模型中写了很多inverse_ofpostgresql-9.4

P.P.S。我是<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <set android:interpolator="@android:anim/decelerate_interpolator" android:fillBefore="false"> <alpha android:duration="1200" android:fromAlpha="0.0" android:toAlpha="1.0" /> <translate android:duration="1200" android:fromYDelta="70%p" android:toYDelta="0%p"/> </set> </set> 用户

2 个答案:

答案 0 :(得分:0)

您的交易无效,因为您使用的是create。您需要使用爆炸版本(create!)来引发故障异常,从而触发回滚。请注意,您自己需要rescue InvalidRecord例外。

答案 1 :(得分:0)

在我看来,它可能是这样的:

  def create
    @user = User.new(params[:user])

    respond_to do |format|
      if @user.save
         process_bonuses_for_user
         process_actions_for_user
         # et.c., giant amount of methods
         ...
         format.html { redirect_to ... }
      end
    end