我通过我们的用户表拥有父/子关系,模型如下:
class User < ActiveRecord::Base
# Parents relationship
has_many :children_parents, :class_name => "ParentsChild", :foreign_key => "child_id", :dependent => :destroy
has_many :parents, :through => :children_parents
# Children relatiopnship
has_many :parents_children, :class_name => "ParentsChild", :foreign_key => "parent_id", :dependent => :destroy
has_many :children, :through => :parents_children
...
end
在parents_child.rb中:
class ParentsChild < ActiveRecord::Base
belongs_to :parent, :class_name => "User"
belongs_to :child, :class_name => "User"
end
现在,我们的“添加子项”表单(仅使用vanilla嵌套属性)可以为父项多次添加同一个用户。我不确定在ParentsChild关系中强制实现唯一性的“正确”方法是什么,尽管我倾向于在数据库层(parent_id, child_id)
上使用唯一索引(当然使用迁移)。
我确信我也可以在UsersController :: update方法中强制执行唯一性约束,但是更愿意避免更改该代码(现在它根本不引用父/子,这要归功于表单中的嵌套属性/模型)如果可能的话。我最关心的是确保我们使用“正确”的解决方案。什么是'正确'或'轨道'的方式来做到这一点?
答案 0 :(得分:6)
使用has_many:through,您可以指定:uniq作为选项,如下所示:
has_many :parents, :through => :children_parents, :uniq => true