Domanda

Ho le seguenti entità:

  • utente
  • Società
  • Organizzazione

Gli utenti devono essere in grado di aggiungere utenti, aziende, organizzazioni, e gli oggetti futuro partito alla loro lista amici.

La mia idea originale ha coinvolto con un oggetto amicizia con una relazione polimorfica per l'amico in questo modo:

schema Amicizia semplificata:

  • user_id
  • friendable_id
  • friendable_type
User
- has_many :businesses, :through => :friendships, :conditions => ['friendable_type=?', 'Business'], :source => :friendable

Il mio problema è che Ruby on Rails ActiveRecord non supporta has_many attraverso relazioni attraverso relazioni polimorfiche sul tavolo unirsi a tale.

Alla fine voglio avere una singola tabella iscriverti per essere in grado di scorrere per avere una lista di amici di tutti i tipi, alcuni tipi, ecc come di seguito:

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)

Ho considerato rendendo l'utente, Business e Organizzazione ereditare da una classe del partito generica e fare il punto di associazione alla classe del partito di base, ma nel contesto di un ORM che porta a una serie di campi di spazzatura e solo sembra sporca.

Quello che mi piacerebbe sapere è come gli altri avrebbero affrontare una situazione come questa in cui si desidera creare relazioni uno-a-molti agli oggetti simili attraverso un comune uniscono tabella utilizzando ActiveRecord, evitando questo errore::)

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

Qualche consiglio molto apprezzato.

Grazie!

È stato utile?

Soluzione 2

Sembra che i Rails plugin 'has_many_polymorphs' mi permette di fare esattamente quello che voglio.

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

L'aggiunta di questa linea al mio modello User mi ha dato la funzionalità che volevo:

has_many_polymorphs :friendables, :from => [:businesses, :organizations], :through => :friendships

Altri suggerimenti

Non utilizzare: attraverso, l'uso: come => friendable invece in relazione has_many polimorfico

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top