簡體   English   中英

禁用ActiveRecord :: Base.transaction內部的自動遞增ID

[英]Disable autoincrementing id inside of ActiveRecord::Base.transaction

我有一個用於注冊的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成功創建時,這是正常情況,但當User在注冊表單上輸入錯誤時,這是​​不正常的情況。

如何禁用這種不可預測的行為?

PS我知道這一切都是工作的時候我寫@user = User.new(@params[:user])在開始create方法和@user.save底,但也有很多社團,我不要不想在我的模型中編寫很多autosaveinverse_of

PPS我是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM