8 votes

Nommer une relation Rails has_many :through :polymorphic

J'ai un peu de mal à mettre en place une relation Rails has_many :through :polymorphic.

Je suis conscient que ce sujet est bien documenté sur SO mais je pense que mon problème est dû à mon modèle et aux noms des clés étrangères plutôt qu'à la syntaxe, c'est-à-dire que je pense que c'est un problème de "j'ai regardé le code trop longtemps" qui nécessite juste une autre paire d'yeux.

Quoi qu'il en soit, j'ai la configuration suivante :

class Milestone < ActiveRecord::Base
  has_many :responsible_items, :as => :responsibility
  has_many :responsible, :through => :responsible_items
end

class ResponsibleItem < ActiveRecord::Base
  belongs_to :responsible, :class_name => "User"
  belongs_to :responsibility, :polymorphic => true
end

class User < ActiveRecord::Base
  has_many :responsible_items, :foreign_key => :responsible_id
  has_many :responsibilities, :through => :responsible_items
end

Cela semble fonctionner correctement, sans erreur, du côté de Milestone. Par exemple, dans le terminal, je peux écrire :

Milestone.first.responsible

et j'obtiens une collection vide comme je m'y attendais.

Cependant, du point de vue de l'utilisateur, la course :

User.first.responsibilities

renvoie une erreur AR :

ActiveRecord::HasManyThroughAssociationPolymorphicSourceError: Cannot have a has_many :through association 'User#responsibilities' on the polymorphic object 'Responsibility#responsibility'.

Je suppose que le problème est lié au fait que je fais référence à la relation Utilisateur en tant que :responsable. Est-ce exact ?

Toute aide serait très appréciée, merci.

12voto

Pete Points 903

Grâce au commentaire de @Abid, j'ai réfléchi à la logistique nécessaire pour faire entrer tous les membres de l'équipe. responsibilities pour un utilisateur, ce qui n'était pas envisageable. J'avais besoin d'être plus spécifique sur ce que je voulais de la relation et comme résultat, la définition suivante a fonctionné :

class User < ActiveRecord::Base
  has_many :responsible_items, :foreign_key => :responsible_id
  has_many :milestone_responsibilities, :through => :responsible_items, :source => :responsibility, :source_type => 'Milestone'
end

Je peux ensuite l'étendre en ajoutant d'autres relations polymorphes sur d'autres modèles par exemple :

class User < ActiveRecord::Base
  has_many :responsible_items, :foreign_key => :responsible_id
  has_many :milestone_responsibilities, :through => :responsible_items, :source => :responsibility, :source_type => 'Milestone'
  has_many :task_responsibilities, :through => :responsible_items, :source => :responsibility, :source_type => 'Task'
end

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