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.
¿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
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
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