Рельсов Полиморфная Ассоциация - PullRequest
2 голосов
/ 18 мая 2011

Мне трудно понять полиморфные ассоциации в Rails.У меня есть две модели, Группа и Пользователь.

Пользователь должен принадлежать к группе, но у Группы могут быть пользователи, имеющие группы, и группы, имеющие группу.Мне нужно, чтобы мои группы были похожи на дерево, которое, как мне кажется, должно помочь гемам Ancestry, но я еще не пробовал.

Похоже, мне нужна какая-то модель объединения, членство, в которой есть user_idи group_id.Тогда я мог бы сделать has_many: сквозной, чтобы связать пользователей с группами, но как я мог бы заставить его иметь много групп?Будет ли членство полиморфной моделью?

Спасибо!

Энди

Ответы [ 4 ]

4 голосов
/ 18 мая 2011

Это не полиморфная ассоциация.Полиморфная ассоциация - это ассоциация, которая выходит за пределы типов классов, таких как класс изображений, принадлежащий классу людей и собак.

Вы говорите об наследовании одной таблицы, где группы могут принадлежать другой группе и иметь другие группы.Что-то вроде того, что ниже, - это то, что вы ищете.

Это всего лишь воздушный код, возможно, понадобятся некоторые настройки

class User
  belongs_to :group
end

class Group
  has_many :users
  has_many :sub_groups, :class => "Group", :foreign_key => :parent_group_id
  belongs_to :parent_group, :class => "Group", :foreign_key => :parent_group_id
end
2 голосов
/ 18 мая 2011

Я думаю, что родословная - правильный ответ.Я использовал намного более старый, act_as_tree, и это было полезно.Начиная новый проект сейчас, я бы использовал Ancestry.Вы можете сделать это без этого, как предлагали другие ответы, но вы не получите все бесплатные методы, которые Ancestry дает вам.

2 голосов
/ 18 мая 2011

Проверьте эту ссылку: Связи модели Rails . Я нашел это очень полезным для того, чтобы легко и хорошо закрепить различные рельсовые опоры.

РЕДАКТИРОВАТЬ: фиксированный URL. извините.

2 голосов
/ 18 мая 2011

Да, вы в основном получили это.Для вашей модели членства потребуются следующие поля:

group_id
member_id
member_type

group_id - это группа, к которой принадлежит «участник».member_id будет идентификатором Person или Group, а member_type будет 'Person' или 'Group'.

Членство будет иметь следующую ассоциацию:

class Member < ActiveRecord::Base
  belongs_to :member, :polymorphic => true
end

Тогда ваш пользователь и группаклассы будут иметь что-то вроде

has_many :memberships, :as => :member
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...