2012-04-20 15 views
8

Im avere un po 'di problema nella configurazione di Rails has_many: through: relazione polimorfica.Naming a Rails has_many: through: relazione polimorfa

Sono consapevole questo argomento è welldocumented su SO, ma penso che il mio problema è giù per il mio modello e nomi foreign_key al contrario di sintassi cioè penso che questo è un problema "Sono stato a guardare il codice troppo a lungo" quello richiede solo un altro set di occhi.

Comunque ho la seguente configurazione:

class Milestone < ActiveRecord::Base 
    has_many :responsible_items, :as => :responsibility 
    has_many :responsible, :through => :responsible_items 
end 

class ResponsibleItem < ActiveRecord::Base 
    belongs_to :responsible, :class_name => "User" 
    belongs_to :responsibility, :polymorphic => true 
end 

class User < ActiveRecord::Base 
    has_many :responsible_items, :foreign_key => :responsible_id 
    has_many :responsibilities, :through => :responsible_items 
end 

Questo sembra funzionare bene, senza errori, dal lato Milestone delle cose. Ad esempio, nel terminale posso scrivere:

Milestone.first.responsible 

... e ottenere un insieme vuoto come mi aspetto.

Tuttavia, dal lato utente delle cose, in esecuzione:

User.first.responsibilities 

... restituisce un errore AR:

ActiveRecord::HasManyThroughAssociationPolymorphicSourceError: Cannot have a has_many :through association 'User#responsibilities' on the polymorphic object 'Responsibility#responsibility'. 

Sto assumendo il problema è qualcosa a che fare con il fatto che Mi riferisco alla relazione dell'utente come: responsabile. È giusto?

Qualsiasi aiuto sarebbe molto apprezzato, grazie.

+1

quali sono i modelli che sono l'altro lato della relazione polimorfica? è solo una pietra miliare o qualsiasi altro modello? e quando stai facendo User.first.responsibilities ti aspetti di ottenere oggetti Milestone? appartiene a: responsabilità,: polimorfo => true – Abid

+0

Ci saranno altri modelli nella relazione polimorfica ma Milestone è l'unico che ho costruito finora. Quando faccio 'User.first.responsibilities' mi aspetto che gli oggetti Milestone si. – Pete

+1

Ah ok @Abid mi hai fatto riflettere con la tua domanda. Naturalmente non sarò in grado di estrarre una serie di "responsabilità" attraverso la relazione: polimorfica perché appartengono tutti a oggetti diversi. Di conseguenza, devo essere più specifico sul modello User e indicare quali responsabilità voglio cioè 'has_many: milestone_responsibilities,: through =>: responsible_items,: source =>: responsibility,: source_type => 'Milestone'' – Pete

risposta

11

Grazie al commento di @ Abid, ho pensato alla logistica di inserire tutti gli responsibilities per un utente, che non sarebbe stato possibile. Avevo bisogno di essere più specifico su ciò che ho voluto dal rapporto e, come risultato definendo i seguenti lavorato:

class User < ActiveRecord::Base 
    has_many :responsible_items, :foreign_key => :responsible_id 
    has_many :milestone_responsibilities, :through => :responsible_items, :source => :responsibility, :source_type => 'Milestone' 
end 

posso quindi estendere questo come aggiungo ulteriori rapporti polimorfi su altri modelli, ad esempio:

class User < ActiveRecord::Base 
    has_many :responsible_items, :foreign_key => :responsible_id 
    has_many :milestone_responsibilities, :through => :responsible_items, :source => :responsibility, :source_type => 'Milestone' 
    has_many :task_responsibilities, :through => :responsible_items, :source => :responsibility, :source_type => 'Task' 
end 
+1

esattamente quello era il mio punto di fare la domanda in modo da poter capire cosa stai facendo manca qualcosa :) – Abid

+0

Grazie! Questo mi ha aiutato! :) – ZedTuX

+0

Wow, questo è proprio quello che stavo cercando! "source_type" mi ha salvato la giornata. –

Problemi correlati