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!

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top