Il modo migliore per modellare “amicizia” di un utente con entità diverse?
-
13-09-2019 - |
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!
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