在连接模型上强制唯一性的正确方法?(has_many:通过)

Bre*_*der 5 activerecord ruby-on-rails unique has-many-through

我通过users表拥有父/子关系,模型如下:

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
Run Code Online (Sandbox Code Playgroud)

在parents_child.rb中:

class ParentsChild < ActiveRecord::Base

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

end
Run Code Online (Sandbox Code Playgroud)

现在,我们的"添加子项"表单(仅使用vanilla嵌套属性)可以为父项多次添加同一个用户.我不确定在ParentsChild关系中强制实现唯一性的"正确"方法是什么,尽管我倾向于(parent_id, child_id)在数据库层使用唯一索引(当然使用迁移).

我确信我还可以在UsersController :: update方法中强制执行唯一性约束,但是更愿意避免更改该代码(现在它完全不引用父/子,这要归功于表单/模型中的嵌套属性)可能.我最关心的是确保我们使用"正确"的解决方案.什么是'正确'或'轨道'的方式来做到这一点?

Dom*_*nic 6

使用has_many:through,您可以指定:uniq作为选项,如下所示:

  has_many :parents, :through => :children_parents, :uniq => true
Run Code Online (Sandbox Code Playgroud)

  • 或者在rails 4中,`has_many:parents, - > {uniq},:through =>:children_parents` (5认同)