ActiveRecord, has_many: through, et associations polymorphes

Gens,

Vous voulez vous assurer que je comprends bien. Et s’il vous plait, ignorez le cas de l’inheritance ici (SentientBeing), en essayant plutôt de vous concentrer sur les modèles polymorphes dans has_many: par les relations. Cela dit, considérez ce qui suit …

class Widget  :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  grouper has_many :widgets, :through => :widget_groupings end class Alien  grouper has_many :widgets, :through => :widget_groupings end class WidgetGrouping  true end 

Dans un monde parfait, j’aimerais, avec un widget et une personne, faire quelque chose comme:

 widget.people << my_person 

Cependant, quand je fais cela, j’ai remarqué que le ‘type’ du ‘grouper’ est toujours nul dans widget_groupings. Cependant, si je dois quelque chose comme ceci:

 widget.widget_groupings < 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 regardais potentiellement un bogue.

Merci pour toute aide!

Il existe un problème connu avec Rails 3.1.1 qui brise cette fonctionnalité. Si vous rencontrez ce problème, essayez d’abord la mise à niveau, il a été corrigé dans la version 3.1.2.

Tu es si proche. Le problème est que vous utilisez abusivement l’option: source. : source devrait pointer sur la relation amie-polymorphe. Ensuite, il vous suffit de spécifier: source_type pour la relation que vous essayez de définir.

Ce correctif au modèle Widget devrait vous permettre de faire exactement ce que vous recherchez.

 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 

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

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 bug, c’est juste quelque chose qui n’a pas encore été implémenté. J’imagine que nous voyons cela dans la fonctionnalité, car tout le monde a un cas dans lequel ils pourraient l’utiliser.