Pregunta ActiveRecord, has_many: through y Asociaciones polimórficas


Gente,

Quiero asegurarme de que entiendo esto correctamente. Y por favor ignore el caso de la herencia aquí (SentientBeing), tratando de enfocarse en modelos polimórficos en has_many: a través de las relaciones. Dicho esto, considere lo siguiente ...

class Widget < ActiveRecord::Base
  has_many :widget_groupings

  has_many :people, :through => :widget_groupings, :source => :person, :conditions => "widget_groupings.grouper_type = 'Person'"
  has_many :aliens, :through => :widget_groupings, :source => :alien, :conditions => "video_groupings.grouper_type = 'Alien'"
end

class Person < ActiveRecord::Base
  has_many :widget_groupings, :as => grouper
  has_many :widgets, :through => :widget_groupings
end

class Alien < ActiveRecord::Base
  has_many :widget_groupings, :as => grouper
  has_many :widgets, :through => :widget_groupings  
end

class WidgetGrouping < ActiveRecord::Base
  belongs_to :widget
  belongs_to :grouper, :polymorphic => true
end

En un mundo perfecto, me gustaría, con un Widget y una Persona, hacer algo como:

widget.people << my_person

Sin embargo, cuando hago esto, he notado que el 'tipo' de 'grouper' siempre es nulo en widget_groupings. Sin embargo, si hago algo como lo siguiente:

widget.widget_groupings << WidgetGrouping.new({:widget => self, :person => my_person}) 

Entonces todo funciona como normalmente hubiera esperado. No creo que haya visto esto ocurrir con asociaciones no polimórficas y solo quería saber si esto era algo específico de este caso de uso o si estoy potencialmente mirando un error.

¡Gracias por cualquier ayuda!


111
2017-11-05 20:12


origen


Respuestas:


Hay un problema conocido con Rails 3.1.1 que rompe esta funcionalidad. Si tiene este problema primero intente actualizar, se ha solucionado en 3.1.2

Estás muy cerca. El problema es que estás haciendo un uso indebido de la opción: fuente. : source debe apuntar a la relación polimórfica belongs_to. Entonces, todo lo que necesita hacer es especificar: tipo_origen para la relación que está tratando de definir.

Esta solución al modelo de widget debería permitirle hacer exactamente lo que está buscando.

class Widget < ActiveRecord::Base
  has_many :widget_groupings

  has_many :people, :through => :widget_groupings, :source => :grouper, :source_type => 'Person'
  has_many :aliens, :through => :widget_groupings, :source => :grouper, :source_type => 'Alien'
end

157
2017-11-05 23:53



Como se mencionó anteriormente, esto no funciona con los rieles 3.1.1 debido a un error en: source, pero está fijo en Rails 3.1.2


3
2017-12-04 13:02



tiene muchos: a través y polimórficos no funcionan juntos. Si intenta acceder a ellos directamente, debería arrojar un error. Si no me equivoco, debe escribir Widget.people y la rutina de inserción.

No creo que sea un error, es solo algo que aún no se ha implementado. Me imagino que lo vemos en la función, porque todos tienen un caso en el que podrían usarlo.


-3
2017-11-05 23:21