[英]Has_one association should be a has “only” one association
我有一个User和Gallery模型以及以下关联:
attr_accessible :name, :description
belongs_to :user
has_one :gallery
通过表单创建一个库,它不是基于用户创建(我这样做是因为不允许某些用户创建一个库)
这是带有create动作的gallery控制器:
def create
@gallery = Gallery.new(params[:gallery])
@gallery.user_id = current_user.id # save user_id to gallery
if @gallery.save
redirect_to @gallery, :notice => "Your gallery has been successfully created."
else
render :action => 'new'
end
end
1.)我的第一个问题是:
当我像这样建立一对一的关联时,用户可以创建他想要的多个图库。 那么它不是真正的“唯一”一个联想吗? (我认为我没有得到这个概念。为什么没有出现错误?)
2.)我的第二个问题:
为了每个用户只有一个图库,我对图库模型中的user_id进行了验证
validates :user_id, :uniqueness => true
这是避免与一个用户关联的许多图库记录的正确方法吗?
感谢Reuben,我这样说:
def new
if current_user.gallery == nil
@gallery = current_user.build_gallery
else
flash[:error] = "You already have a gallery"
end
end
def create
@gallery = current_user.build_gallery(params[:gallery])
if @gallery.save
redirect_to @gallery, :notice => "Your gallery has been successfully created."
else
render :action => 'new'
end
end
<% if current_user.gallery == nil %>
<%= form ... %>
<% end %>
无需user_id验证
回答你的第一个问题: has_one
真正做的是它将LIMIT 1
子句附加到相应的sql查询,仅此而已。 这就是为什么,在您的情况下,用户可以创建任意数量的画廊。
您可以检查新操作以查看用户是否已有图库,并重定向用户说他们已经有图库,或者提醒用户创建新图库会破坏其现有图库。 在后一种情况下,您还需要在创建操作中检查现有库并在保存新库之前将其删除,否则您将拥有无库画廊填充数据库。
在您的视图中,如果用户没有图库,您可以检查相同内容并仅显示新链接。
要回答第二个问题,可以为创建外键的迁移设置unique to true:
add_index:gallery,:user_id,unique:true
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.