В качестве первого шага вы можете использовать одну и ту же переменную независимо от типа профиля, т.е.
@profile = @user.isAdmin? ? AdminProfile.new : PersonalProfile.new
Это использует условный оператор Руби , который имеет форму условие ? значение, если true : значение, если false .то есть, если @user.isAdmin?
оценивается как true
, тогда @profile
получает значение после ?
.Если @user.isAdmin?
равно false, @profile
получает значение после :
.Обратите внимание, что, поскольку имя вашего метода уже заканчивается на ?
, вы получаете это двойное ?
.
, а затем
if (@user.isAdmin?)
@user.admin_profile = @profile
@user.admin_profile_id = @profile.id
else
@user.personal_profile = @profile
@user.personal_profile_id = @profile.id
end
Кроме того, не уверен, что это код Rails, но если это так, вам не нужно устанавливать admin_profile
и admin_profile_id
, и на самом деле @profile.id
не будет установлен, поскольку профиль не сохранен.Так что, возможно, вы могли бы уменьшить if/else
до:
if (@user.isAdmin?)
@user.admin_profile = @profile
else
@user.personal_profile = @profile
end
Обновление
Вы также должны посмотреть на метод create_association , который вы получаетекогда вы используете belongs_to
ассоциацию.Вы можете заставить Rails создавать и сохранять связанный объект за один шаг, например
@user.create_personal_profile