Melhor maneira de modelar “amizade” de um usuário com diferentes entidades?
-
13-09-2019 - |
Pergunta
Eu tenho as seguintes entidades:
- Usuário
- Empresa
- Organização
Os usuários precisam ser capazes de adicionar usuários, empresas, organizações, e futuros objetos partido à sua lista de amigos.
A minha ideia original envolvia o uso de um objeto Amizade com um relacionamento polimórfico para o amigo assim:
esquema simplificado Amizade:
- user_id
- friendable_id
- friendable_type
User - has_many :businesses, :through => :friendships, :conditions => ['friendable_type=?', 'Business'], :source => :friendable
Meu problema é que Ruby on Rails ActiveRecord não suporta has_many através de relacionamentos através de relações polimórficas em cima da mesa como participar.
No final, eu quero ter um único unir a tabela para ser capaz para percorrer para obter uma lista de amigos de todos os tipos, certos tipos, etc. como abaixo:
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)
Eu considerei fazer o usuário, Trabalho e Organização herdar de uma classe genérica do partido e fazer o ponto de associação à base de classe do partido, mas no contexto de um ORM que leva a um monte de campos de lixo e apenas parece sujo.
O que eu gostaria de saber é como os outros se aproximaria de uma situação como esta, onde você deseja criar relacionamentos um-para-muitos para objetos semelhantes através de um comum unir a tabela usando ActiveRecord, evitando este erro::)
Cannot have a has_many :through association 'User#businesses' on the polymorphic object 'Friendship#friendable'.
Qualquer conselho muito apreciada.
Obrigado!
Solução 2
Parece que os Rails plugins 'has_many_polymorphs' me permite fazer exatamente o que eu quero.
http://github.com/fauna/has_many_polymorphs/tree/master
Adicionando esta linha para o meu modelo de usuário me deu a funcionalidade que eu queria:
has_many_polymorphs :friendables, :from => [:businesses, :organizations], :through => :friendships
Outras dicas
Não use: através, use: como => friendable vez em relação has_many polimórfica