2009-03-06 20 views
5

Ecco cosa sto cercando di ottenere: ho una tabella Users e ogni utente può essere una qualsiasi di una dozzina di tipi: attore, ballerino, regista, ... che viene determinato dopo la registrazione. Ogni tipo di utente può avere un numero qualsiasi di profili. Per esempio. gli attori possono avere un numero qualsiasi di actor_profiles, i ballerini cand hanno un numero qualsiasi di dancer_profiles, ...Associazione polimorfica Ruby on Rails

Il problema è come collegare il profilo con l'utente. Una soluzione ovvia sarebbe quella di creare una tabella adizionale per ogni tipo di profilo, in modo che potessi usare un polymorphic belongs_to in User e quindi un semplice appartiene a ciascun profilo, ma ciò non sembra ottimale. Un modo decisamente migliore sarebbe quello di dire ai binari che l'utente è di tipo actor, in modo che user.profiles possa funzionare in modo naturale, senza confusione. Le rotaie supportano tale comportamento, o c'è qualcosa di meglio del precedente? Grazie.

risposta

1

definire i rapporti nelle sottoclassi: risposta

class User < ActiveRecord::Base 
end 

class Actor < User 
    has_many :profiles, :class_name => "ActorProfile" 
end 

class Dancer < User 
    has_many :profiles, :class_name => "DancerProfile" 
end 
3

di PJB utilizza Single Table Inheritance. Affinché ciò funzioni è necessario aggiungere una colonna denominata type agli utenti e alle tabelle * dei profili, in modo che Rails possa salvare il tipo di utente (poiché Actor, Dancer, ecc. Sono solo sottoclassi di User).

Ciò significa che verranno tutti salvati nelle tabelle utenti/profili, ma quando vengono istanziati, ActiveRecord li istanzia da loro come il tipo corretto. Con questo sarete in grado di chiamare

User.find 

ma anche fare le cose come

Actor.find, Actor.all, etc 

e lo hanno ambito a soli attori

Google rails single table inheritance per maggiori dettagli ed esempi.

  • Naturalmente avresti bisogno di dichiarare il vostro profilo sottoclassi allo stesso modo in cui avete dichiarato il vostro utente sottoclassi

classe Profilo < ActiveRecord :: Base belongs_to: utente fine

classe ActorProfile < Profilo fine

classe Ballerino Profilo < Profilo fine

ecc

0

Avrai bisogno di assicurarsi che il tavolo per l'utente ha una colonna chiamata "tipo". Rails salverà il TIPO della Classe (Utente, Attore, ecc.) Nel campo del database.