through rails many how has_and_belongs_to_many has foreign example create belongs and active ruby-on-rails activerecord polymorphic-associations

ruby on rails - rails - ActiveRecord, has_many: through y Asociaciones polimórficas



rails foreign key (3)

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!


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


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.


Existe 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