У меня есть следующие сущности:
- Пользователь
- Компания
- Организация
Пользователи должны иметь возможность добавлять пользователей, компании, организации и будущие сторонние объекты в свой список друзей.
Моя первоначальная идея заключалась в использовании объекта 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'.
Любые советы очень ценятся.
Спасибо!