ruby on rails-禁用ActiveRecord::Base.transaction内部的自动递增id



我有一个用于注册的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的奇怪行为。即使它运行成功(创建了很多模型)或不成功(没有保存它们),User模型的id也在自动递增。因此,每次尝试使用我的FormObject保存内容时,都会为User增加下一个id的值。当User创建成功时,这是正常情况,但当用户在注册表单上出错时,这就不正常了

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

附言:当我在create方法的开头写@user = User.new(@params[:user]),在结尾写@user.save时,我知道一切都是有效的,但有很多关联,我不想在我的模型中写很多autosaveinverse_of

p.p.S.我是postgresql-9.4用户

您的事务无法工作,因为您使用的是create。您需要使用bang版本(create!)在失败时引发异常,从而触发回滚。请注意,您需要自己rescue InvalidRecord异常。

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

  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

最新更新