Amigos
Quiero asegurarme de que entiendo esto correctamente. Y, por favor, ignore el caso de la herencia aquí (SentientBeing), tratando de centrarse en los modelos polimórficos en has_many: a través de 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, dado un widget y una persona, hacer algo como:
widget.people << my_person
Sin embargo, cuando hago esto, he notado que el 'tipo' del 'agrupador' 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 que esto ocurra con asociaciones no polimórficas y solo quería saber si esto era algo específico para este caso de uso o si potencialmente estoy mirando un error.
¡Gracias por cualquier ayuda!
Como se mencionó anteriormente, esto no funciona con rails 3.1.1 debido a un error en: source, pero se corrigió en Rails 3.1.2
fuente
tiene muchos: completo y polimórfico no funcionan juntos. Si intenta acceder a ellos directamente, debería arrojar un error. Si no me equivoco, tienes que escribir a mano widget.people y la rutina push.
No creo que sea un error, es 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.
fuente