在Has_many通过关联避免“保存!”

时间:2011-10-02 19:06:10

标签: ruby-on-rails ruby-on-rails-3 validation activerecord has-many-through

我有一个has_many通过关联属性和一些关于“连接模型”的验证。当我尝试执行@user.projects << @project之类的操作并且已经创建了关联(因此唯一性验证失败)时,会引发异常,而不是将错误添加到验证错误中。

class User 
  has_many :project_users
  has_many :projects, :through => :project_users

class Project
  has_many :project_users
  has_many :users, :through => :project_users

class ProjectUser
  belongs_to :user
  belongs_to :project


# ...
if @user.projects << @project
  redirect_to 'somewhere'
else
  render :new
end

如何创建关联,就像使用<<方法一样,但是调用save而不是save!,以便我可以在表单上显示验证错误,而不是使用rescue抓住这个并妥善处理它?

3 个答案:

答案 0 :(得分:0)

我认为你不能。来自API

  

collection&lt;&lt;(object,...)将一个或多个对象添加到集合中   将其外键设置为集合的主键。注意   此操作立即触发update sql而不等待保存   或更新父对象的调用。

  

如果在更换集合时保存失败(通过association =),则a   引发ActiveRecord :: RecordNotSaved异常并赋值   取消。

解决方法可能如下所示:

if @user.projects.exists? @project
  @user.errors.add(:project, "is already assigned to this user") # or something to that effect
  render :new
else 
  @user.projects << @projects
  redirect_to 'somewhere'
end

这将允许您捕获关联已存在的故障。当然,如果关联上的其他验证可能失败,您仍然需要捕获异常,因此它可能不会非常有用。

答案 1 :(得分:0)

也许您可以尝试为项目模型添加验证,例如:

验证:user_id,:uniqueness =&gt; {:scope =&gt; :user_id} ,: on =&gt; :创建

不确定这是否有助于避免保存!方法..

答案 2 :(得分:0)

尝试将关联声明为

has_many :projects, :through => :project_users, :uniq => true

结帐http://guides.rubyonrails.org/association_basics.html中的第4.3.2.21节。