Отключить автоинкрементный идентификатор внутри 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, Даже если он работал успешно (создать много моделей) или неуспешно (не сохраняя их), id из User Модель автоинкрементная. Таким образом, каждый пытается сохранить что-то, используя мой FormObject увеличить значение следующего id для пользователя. Это нормальная ситуация, когда User создан успешно, но не нормально, когда пользователь делает ошибку в регистрационной форме.

Как я могу отключить это непредсказуемое поведение?

PS я знаю что все работает когда я пишу @user = User.new(@params[:user]) в начале create метод и @user.save в конце, но есть много ассоциаций, и я не хочу писать много autosave или же inverse_of в моих моделях.

PPS Я postgresql-9.4 пользователь

2 ответа

Ваша транзакция не работает, потому что вы используете create, Вам нужно использовать версию взрыва (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
Другие вопросы по тегам