Has_one关联应该是一个“只有”一个关联

时间:2011-12-12 13:14:24

标签: ruby-on-rails associations has-one

我有用户和图库模型以及以下关联:

gallery.rb

attr_accessible :name, :description

belongs_to :user

user.rb

has_one :gallery 

图库是通过表单创建的,而不是基于用户创建 (我这样做是因为不允许某些用户创建图库)

以下是具有创建操作的库控制器:

galleries_controller.rb

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

这是避免与一个用户关联的许多图库记录的正确方法吗?

修改

感谢鲁本,我这样说:

控制器

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

在视图(new.html.erb)

<% if current_user.gallery == nil %>
  <%= form ... %>
<% end %>

不需要user_id验证

3 个答案:

答案 0 :(得分:5)

重新提出你的第一个问题:has_one真正做的是它将LIMIT 1子句附加到相应的sql查询,仅此而已。这就是为什么,在您的情况下,用户可以创建任意数量的画廊。

答案 1 :(得分:3)

您可以检查新操作以查看用户是否已有图库,并重定向用户说他们已经拥有图库,或者提醒用户创建新图库会破坏其现有图库。在后一种情况下,您还需要检查创建操作中的现有库并在保存新库之前将其删除,否则您将拥有无库画廊填充数据库。

在您的观看中,如果用户没有图库,您可以检查相同内容并仅显示新链接。

答案 2 :(得分:0)

要回答第二个问题,您可以为创建外键的迁移设置unique to true:

add_index:gallery,:user_id,unique:true