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

时间:2010-10-22 15:36:41

标签: 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_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方法中强制执行唯一性约束,但是更愿意避免更改该代码(现在它根本不引用父/子,这要归功于表单中的嵌套属性/模型)如果可能的话。我最关心的是确保我们使用“正确”的解决方案。什么是'正确'或'轨道'的方式来做到这一点?

1 个答案:

答案 0 :(得分:6)

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

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