这是一个Ruby代码:
if (@user.isAdmin?)
@admin_profile = AdminProfile.new
@user.admin_profile = @admin_profile
@admin_profile.save
@user.admin_profile_id = @admin_profile.id
else
@personal_profile = PersonalProfile.new
@user.personal_profile = @personal_profile
@personal_profile.save
@user.personal_profile_id = @personal_profile.id
end
是否可以干掉这段代码?两个代码非常相似,但正如您所看到的,它们有一些区别,是否可以使其更简单?
答案 0 :(得分:5)
作为第一步,您可以使用相同的变量,无论简档类型如何。
@profile = @user.isAdmin? ? AdminProfile.new : PersonalProfile.new
这是使用具有条件形式的Ruby conditional operator? value if true : value if 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
<强>更新强>
您还应该查看使用belongs_to
关联时获得的create_association方法。您可以让Rails在一个步骤中创建并保存关联的对象,例如。
@user.create_personal_profile
答案 1 :(得分:1)
如果要减少if else
@ user.isAdmin? ? @ user.admin_profile = @profile:@ user.personal_profile = @profile