Ruby on rails 强制联接模型唯一性的正确方法?(有很多:通过)

Ruby on rails 强制联接模型唯一性的正确方法?(有很多:通过),ruby-on-rails,activerecord,unique,has-many-through,Ruby On Rails,Activerecord,Unique,Has Many Through,我通过我们的用户表建立了父子关系,模型如下: class User < ActiveRecord::Base # Parents relationship has_many :children_parents, :class_name => "ParentsChild", :foreign_key => "child_id", :dependent => :destroy has_many :parents, :through => :children

我通过我们的用户表建立了父子关系,模型如下:

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
class用户“ParentsChild”、:foreign\u key=>“child\u id”、:dependent=>:destroy
有很多:父母,:通过=>:孩子\u父母
#儿童关系
有多个:父项\u子项,:class\u name=>“ParentsChild”,:foreign\u key=>“parent\u id”,:dependent=>:destroy
有很多:孩子,:通过=>:父母\u孩子
...
结束
在parents_child.rb中:

class ParentsChild < ActiveRecord::Base

  belongs_to :parent, :class_name => "User"
  belongs_to :child, :class_name => "User"

end
类ParentsChild“用户” 属于\u to:child,:class\u name=>“用户” 结束 现在,在我们的“添加子项”表单中(仅使用普通的嵌套属性)可以为家长多次将同一用户添加为子项。虽然我倾向于在数据库层的
(parent\u id,child\u id)
上使用唯一索引(当然使用迁移),但我不确定强制ParentsChild关系唯一性的“正确”方法是什么


我确信我也可以在UsersController::update方法中强制实施唯一性约束,但如果可能的话,我更愿意避免更改该代码(由于表单/模型中的嵌套属性,现在它根本不引用父/子代码)。我最关心的是确保我们使用“适当”的解决方案。“正确”或“rails”的方法是什么?

使用has\u many:through,可以指定:uniq作为选项,如下所示:

  has_many :parents, :through => :children_parents, :uniq => true

肯定应该先考虑最简单的解决方案。谢谢对我花了这么长时间来摆弄它,您的答案正是我所需要的。或者在rails 4中,
有很多:父项,>{uniq},:通过=>:children\u父项
值得注意的是,这并没有停止在联接表中创建重复记录,但它确实返回uniq记录,我得到
弃用警告:uniq已弃用,将从Rails 5.1中删除(改用distinct)