我有一个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
抓住这个并妥善处理它?
答案 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节。