2012-04-20 16 views
8

Tengo un problema al configurar una Rails has_many: a través de: relación polimórfica.Nombrar a Rails has_many: a través de: relación polimórfica

Soy consciente de que este tema es welldocumented en SO, pero creo que mi problema se debe a mi modelo y nombres de foreign_key en lugar de sintaxis, es decir, creo que esto es un problema "he estado mirando el código demasiado tiempo" eso solo requiere otro par de ojos.

De todos modos tengo el siguiente configuración:

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 

Esto parece funcionar bien, sin errores, desde el lado de las cosas Milestone. Por ejemplo, en la terminal puedo escribir:

Milestone.first.responsible 

... y obtener una colección vacía como era de esperar.

Sin embargo, desde el lado del usuario de las cosas, ejecutando:

User.first.responsibilities 

... está volviendo un error AR:

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

Asumo el tema es algo que ver con el hecho de que Me refiero a la relación de usuario como: responsable. ¿Es esto correcto?

Cualquier ayuda sería muy apreciada, gracias.

+1

¿Cuáles son los modelos que están al otro lado de la relación polimórfica? ¿es solo un hito o cualquier otro modelo también? y cuando estás haciendo User.first.responsibilities ¿esperas conseguir objetos Milestone? belongs_to: responsibility,: polymorphic => true – Abid

+0

Habrá otros modelos en la relación polimórfica, pero Milestone es el único que he construido hasta ahora. Cuando hago 'User.first.responsibilities' estoy esperando objetos Milestone sí. – Pete

+1

Ah ok @Abid me hiciste pensar con tu pregunta. Naturalmente, no voy a poder sacar una colección de 'responsabilidades' a través de la relación: polimórfica porque todas pertenecen a diferentes objetos. Como resultado, tengo que ser más específico en el modelo de usuario e indicar qué responsabilidades quiero, es decir 'has_many: milestone_responsibilities,: through =>: responsible_items,: source =>: responsibility,: source_type => 'Milestone'' – Pete

Respuesta

11

Gracias al comentario de @ Abid, pensé en la logística de sacar todo responsibilities para un usuario, lo cual no sería factible. Tenía que ser más específico acerca de lo que quería de la relación y como resultado la definición de los siguientes trabajé:

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 

que a continuación se puede extender esto ya que añadir más relaciones polimórficas en otros modelos, por ejemplo:

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

exactamente eso fue mi punto de hacer la pregunta para que pueda entender lo que está haciendo le falta algo :) – Abid

+0

¡Gracias! ¡Esto me ayudó! :) – ZedTuX

+0

¡Guau, esto es justo lo que estaba buscando! "source_type" me salvó el día. –

Cuestiones relacionadas