Лучший способ смоделировать дружбу пользователя с разными сущностями?

У меня есть следующие сущности:

  • Пользователь
  • Компания
  • Организация

Пользователи должны иметь возможность добавлять пользователей, компании, организации и будущие сторонние объекты в свой список друзей.

Моя первоначальная идея заключалась в использовании объекта Friendship с полиморфным отношением к другу, например:

Упрощенная схема дружбы:

  • Идентификатор пользователя
  • Friendable_id
  • дружеский_тип
User
- has_many :businesses, :through => :friendships, :conditions => ['friendable_type=?', 'Business'], :source => :friendable

Моя проблема в том, что Ruby on Rails ActiveRecord не поддерживает has_many через отношения через полиморфные отношения в таблице соединений, например.

В конце концов, я хочу иметь единую таблицу соединений, чтобы иметь возможность выполнять итерацию, чтобы получить список друзей всех типов, определенных типов и т. д., как показано ниже:

john = User.find(5)
john.friendships.map {|friendship| friendship.friendable }
john.businesses (has_many :through scoped to only the businesses)
john.organizations (has_many :through scoped only to the organizations)

Я рассматривал возможность наследования User, Business и Organization от общего класса Party и создания ассоциации, указывающей на базовый класс Party, но в контексте ORM, который приводит к куче ненужных полей, и это просто кажется грязным.

Что я хотел бы знать, так это то, как другие подошли бы к такой ситуации, когда вы хотите создать отношения «один ко многим» для подобных объектов через общую таблицу соединений с использованием ActiveRecord, избегая при этом этой ошибки: :)

Cannot have a has_many :through association 'User#businesses' on the polymorphic object 'Friendship#friendable'.

Любые советы очень ценятся.

Спасибо!


person rwl4    schedule 12.08.2009    source источник


Ответы (2)


Не используйте :through, вместо этого используйте :as=>friendable в полиморфных отношениях has_many

person ez.    schedule 12.08.2009
comment
вот ссылки, поиск полиморфных ассоциаций api.rubyonrails.org/classes/ActiveRecord /Ассоциации/ - person ez.; 12.08.2009
comment
Я думал об этом, но мне нужны роли друзей, а значит, мне нужна таблица соединений. - person rwl4; 13.08.2009

Похоже, плагин Rails has_many_polymorphs позволяет мне делать именно то, что я хочу.

http://github.com/fauna/has_many_polymorphs/tree/master

Добавление этой строки в мою модель User дало мне желаемую функциональность:

has_many_polymorphs :friendables, :from => [:businesses, :organizations], :through => :friendships
person rwl4    schedule 12.08.2009