我是rails的新手,并且是第一次使用has_one关联。
用户模型
class User < ActiveRecord::Base
has_one :shop_profile
validates :user_id, presence: true
validates :user_id, uniqueness: true
end
ShopProfile模型
class ShopProfile < ActiveRecord::Base
belongs_to :user
end
但是我仍然可以为每个用户制作多个ShopProfiles。当用户创建第二个shop_profile时,它会从第一个中删除user_id,但数据库中仍有两个。
如何将用户可以拥有的ShopProfile数量限制为1?
答案 0 :(得分:2)
Rails无法为您执行此操作,您可以自行查找现有记录,也可以创建新记录,并由您自行决定是否确保用户能够使用该记录。我们没有创建第二个ShopProfile
记录。这不应该是一个问题,您应该首先根据现有create
记录的存在回发到正确的操作(update
vs ShopProfile
)对于有问题的用户。如果具有现有ShopProfile
的用户尝试将新的用户发布到create
操作,则您应该提出错误。
根据您的意见澄清:
这里的问题是,如果用户已经拥有个人资料,您可以点击个人资料的创建表单。一旦用户创建了配置文件,如果创建第二个配置文件的行为将导致错误,则用户不应该首先进入此状态。用户拥有个人资料后,您应该将其链接到该个人资料的修改视图,而不是将其带回创建视图,一旦他们出现错误就会产生错误#39;填写表格。
这可能看起来像这样:
<% if @user.shop_profile %>
<%= link_to 'Edit Profile', [:edit, @user.shop_profile] %>
<% else %>
<%= link_to 'Create Profile', new_shop_profile_path %>
<% end %>
如果用户 以某种方式击中了&#34; new&#34;要创建第二个配置文件的操作,您应该立即停止它们,并拒绝呈现创建表单。您的new
操作应该看起来像这样:
def new
if @user.shop_profile
redirect_to edit_shop_profile_path(@user.shop_profile)
else
@shop_profile = ShopProfile.new
end
end
另一种方法是,如果用户要求在拥有现有配置文件时创建新配置文件,则需要向用户提供一些前进方法。这可能是您&#34;创建&#34;的复选框。表单,让他们选择覆盖他们现有的个人资料。关键是,您需要通过应用程序的各种流程为他们提供一些进行的方式,否则您的应用程序基本上就会被破坏。您永远不应该将用户带回到他们填写表单的地方,而没有实际成功提交的方式。
答案 1 :(得分:1)
我认为最好的解决方案是在注册后创建配置文件,以便在您的用户模型中输入此代码
has_one :profile, dependent: :destroy
after_create :create_profile
private
def create_profile
Profile.create(user: self)
end