Отключить автоинкрементный идентификатор внутри 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