4

我有一个 User 和一个 Gallery 模型以及以下关联:

画廊.rb

attr_accessible :name, :description

belongs_to :user

用户.rb

has_one :gallery 

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

这是具有创建操作的画廊控制器:

画廊控制器.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

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

编辑

感谢 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

在视图中(new.html.erb)

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

无需 user_id 验证

4

3 回答 3

5

关于您的第一个问题:has_one真正的作用是将LIMIT 1子句附加到相应的 sql 查询中,仅此而已。这就是为什么在您的情况下,用户可以根据需要创建任意数量的画廊。

于 2011-12-12T14:03:37.617 回答
3

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

在您的视图中,您可以检查相同的内容,并且仅在用户没有图库时才显示新链接。

于 2011-12-12T13:44:40.397 回答
0

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

add_index :gallery, :user_id, unique: true

于 2016-03-06T21:22:14.343 回答