Gens,
Je veux m'assurer de bien comprendre cela. Et s'il vous plaît, ignorez le cas de l'héritage ici (SentientBeing), en essayant de vous concentrer sur les modèles polymorphes dans has_many: through relations. Cela dit, considérez ce qui suit ...
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
Dans un monde parfait, j'aimerais, étant donné un widget et une personne, faire quelque chose comme:
widget.people << my_person
Cependant, lorsque je fais cela, j'ai remarqué que le «type» du «mérou» est toujours nul dans widget_groupings. Cependant, si je fais quelque chose comme ce qui suit:
widget.widget_groupings << WidgetGrouping.new({:widget => self, :person => my_person})
Ensuite, tout fonctionne comme je l'aurais normalement prévu. Je ne pense pas avoir jamais vu cela se produire avec des associations non polymorphes et je voulais juste savoir si c'était quelque chose de spécifique à ce cas d'utilisation ou si je suis potentiellement en train de regarder un bogue.
Merci pour toute aide!
Comme mentionné ci-dessus, cela ne fonctionne pas avec les rails 3.1.1 en raison d'un bogue sur: source, mais il est corrigé dans Rails 3.1.2
la source
a beaucoup: à travers et polymorphe ne fonctionnent pas ensemble. Si vous essayez d'y accéder directement, cela devrait générer une erreur. Si je ne me trompe pas, vous devez écrire à la main widget.people et la routine push.
Je ne pense pas que ce soit un bogue, c'est juste quelque chose qui n'a pas encore été implémenté. J'imagine que nous le voyons dans la fonctionnalité, car tout le monde a un cas dans lequel il pourrait l'utiliser.
la source