Pessoal,
Quero ter certeza de que entendi isso corretamente. E, por favor, desconsidere o caso de herança aqui (SentientBeing), tentando se concentrar em modelos polimórficos em has_many: por meio de relacionamentos. Dito isso, considere o seguinte ...
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
Em um mundo perfeito, gostaria de, com um widget e uma pessoa, fazer algo como:
widget.people << my_person
No entanto, quando faço isso, percebi que o 'tipo' de 'garoupa' é sempre nulo em widget_groupings. No entanto, se eu quiser algo como o seguinte:
widget.widget_groupings << WidgetGrouping.new({:widget => self, :person => my_person})
Então tudo funciona como eu normalmente esperava. Acho que nunca vi isso ocorrer com associações não polimórficas e só queria saber se isso era algo específico para este caso de uso ou se estou potencialmente diante de um bug.
Obrigado por qualquer ajuda!
Como mencionado acima, isso não funciona com o Rails 3.1.1 devido a um bug no: source, mas foi corrigido no Rails 3.1.2
fonte
tem muitos: through e polymorphic não funcionam juntos. Se você tentar acessá-los diretamente, ocorrerá um erro. Se não me engano, você deve escrever widget.people e a rotina push.
Não acho que seja um bug, é apenas algo que ainda não foi implementado. Eu imagino que vejamos no recurso, porque todo mundo tem um caso em que poderia usá-lo.
fonte