117 votes

ActiveRecord, has_many : Associations à travers et polymorphes

Les gens,

Veux m'assurer que je comprends bien. Et veuillez ne pas tenir compte le cas de l'héritage ici (SentientBeing), en essayant de se concentrer plutôt sur polymorphes modèles dans has_many :grâce à des relations. Cela dit, considérez les points suivants...

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, je voudrais, au vu d'un Widget et une Personne, faire quelque chose comme:

widget.people << my_person

Cependant, quand je fais cela, j'ai remarqué que le "type" de la "mérou" est toujours la valeur null dans widget_groupings. Cependant, si j'ai quelque chose comme ce qui suit:

widget.widget_groupings << WidgetGrouping.new({:widget => self, :person => my_person})

Ensuite, tous les ouvrages que je l'aurais normalement prévu. Je ne pense pas que je ai jamais vu cela se produire avec les non polymorphes associations et je voulais juste savoir si c'était quelque chose de spécifique à ce cas d'utilisation, ou si je suis potentiellement en regardant un bug.

Merci pour toute aide!

163voto

EmFi Points 18645

Il y a un problème connu avec Rails 3.1.1 qui rompt cette fonctionnalité. Si vous rencontrez ce problème, essayez d'abord de la mise à niveau, il a été fixé en 3.1.2

Vous êtes si proche. Le problème est que vous êtes une utilisation abusive de l' :option de source. :la source des points de la polymorphes belongs_to relation. Ensuite, tout ce que vous devez faire est de spécifier :source_type pour la relation que vous essayez de définir.

Ce correctif pour le Widget modèle devrait vous permettre de faire exactement ce que vous cherchez.

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

3voto

scottkf Points 75

Comme mentionné ci-dessus, cela ne fonctionne pas avec rails 3.1.1 à cause d’un bug sur : source, mais il est fixé dans les Rails 3.1.2

-4voto

cgr Points 542

a de nombreux : à travers et polymorphe ne fonctionnent pas ensemble. Si vous essayez d’y accéder directement, il doit lever une erreur. Si je ne me trompe pas, vous avez à portée de main widget.people de l’écriture et la routine de pousser.

Je ne pense pas que c’est un bug, c’est juste quelque chose qui n’a pas encore été implémenté. J’imagine que nous le voyons dans la fonction, parce que tout le monde a un cas dans lequel ils pourraient l’utiliser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X