Правильный способ навязать уникальность модели соединения?(has_many: through) - PullRequest
5 голосов
/ 22 октября 2010

У меня есть отношения между родителями и детьми через нашу таблицу пользователей, с такими моделями:

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

И в parent_child.rb:

class ParentsChild < ActiveRecord::Base

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

end

Прямо сейчас, в нашей форме «добавить детей» можно (просто используя вложенные атрибуты ванили) добавить одного и того же пользователя в качестве ребенка несколько раз для родителей. Я не уверен, каков «правильный» способ заставить уникальность в отношениях ParentsChild, хотя я склоняюсь к уникальному индексу на (parent_id, child_id) на уровне базы данных (конечно, используя миграцию).

Я уверен, что мог бы также применить ограничения уникальности в методе UsersController :: update, но предпочел бы избегать изменения этого кода (сейчас он вообще не ссылается на родителей / детей, благодаря вложенным атрибутам в форме / модель) если возможно. Меня больше всего заботит, чтобы мы использовали «правильное» решение. Как это сделать «правильно» или «рельсами»?

1 Ответ

6 голосов
/ 22 октября 2010

Используя has_many: through, вы можете указать: uniq в качестве опции, например:

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