2009-06-11 4 views
0

Je suis en train de définir plusieurs relations polymorphes (has_many_polymorphs plugin) d'un parent seul à même les enfants.has_many_polymorphs multiples dans un seul modèle

note a de nombreux téléspectateurs
note a de nombreux éditeurs
Les téléspectateurs peuvent être soit des utilisateurs ou des groupes
éditeurs pourraient être Utilisateurs ou groupes
L'autorisation est le modèle d'association avec note_id, viewer_id, viewer_type, editor_id, editor_type champs

Tout fonctionne comme attendre aussi longtemps que je ne dispose que d'une relation has_many_polymorphs définie dans le modèle note

class User < ActiveRecord::Base; end 
class Group < ActiveRecord::Base; end 

class Note < ActiveRecord::Base 
    has_many_polymorphs :viewers, :through => :permissions, :from => [:users, :groups] 
end 

class Permission < ActiveRecord::Base 
    belongs_to :note 
    belongs_to :viewer, :polymorphic => true 
end 


Note.first.viewers << User.first # => [#<User id: 1, ....>] 
Note.first.viewers << Group.first # => [#<User id: 1, ....>, #<Group ...>] 
Note.first.viewers.first # => #<User ....> 
Note.first.viewers.second # => #<Group ....> 

Maintenant, les problèmes commencent à apparaître quand j'ajoute la seconde relation

class Note < ActiveRecord::Base 
    has_many_polymorphs :viewers, :through => :permissions, :from => [:users, :groups] 
    has_many_polymorphs :editors, :through => :permissions, :from => [:users, :groups] 
end 

class Permission < ActiveRecord::Base 
    belongs_to :note 
    belongs_to :viewer, :polymorphic => true 
    belongs_to :editor, :polymorphic => true 
end 

Note.first.viewers << User.first # => [#<User id: ....>] 

# >>>>>>>> 
Note.first.editors << User.first 

NoMethodError: You have a nil object when you didn't expect it! 
The error occurred while evaluating nil.constantize 
... vendor/plugins/has_many_polymorphs/lib/has_many_polymorphs/base.rb:18:in `instantiate' 

J'ai essayé d'affiner la définition de has_many_polymorphs, mais cela n'a pas fonctionné. Pas même avec un modèle STI pour ViewPermission < Permission et EditPermission < Permission.

Toute pensée/solutions de contournement/pointeurs d'émission sont appréciés.

Rails 2.3.0

+0

Je pense que vous devez ajouter certains signes de ponctuation dans votre deuxième paragraphe ... –

Répondre

0

Dont vous devez ajouter

has_many :permissions 

à votre note. FYI. Je has_many_polymorphs une fois mais lâchée, il ne fonctionnait pas comme prévu.

Pouvez-vous poster le schéma que vous utilisez pour la permission? Je suppose que la racine du problème réside là, vous devez avoir plusieurs types, paires d'id dans le schéma puisque vous avez deux différents belongs_to dans la définition.

Edit:

Je vois que vous avez posté la question sur github aussi bien. Je ne sais pas si vous avez essayé d'utiliser le polymorphisme double face. Vous avez probablement ... comme je l'ai dit, je n'ai pas été impressionné par ce plugin, car il a apporté une certaine instabilité quand je l'ai utilisé.

== Double-sided polymorphism 

Double-sided relationships are defined on the join model: 

     class Devouring < ActiveRecord::Base 
     belongs_to :guest, :polymorphic => true 
     belongs_to :eaten, :polymorphic => true 

     acts_as_double_polymorphic_join(
      :guests =>[:dogs, :cats], 
      :eatens => [:cats, :birds] 
     )  
     end 


Now, dogs and cats can eat birds and cats. Birds can't eat anything (they aren't <tt>guests</tt>) and dogs can't be 
eaten by anything (since they aren't <tt>eatens</tt>). The keys stand for what the models are, not what they do. 
+0

Le 'has_many: permissions' n'est pas nécessaire. Le schéma tel que décrit dans le deuxième alinéa est: entier: note_id entier: viewer_id chaîne \t: viewer_type entier: editor_id chaîne \t: editor_type – tamersalama

+0

Merci Ryan - oui - j'ai posté sur GitHub comme un problème (http://github.com/fauna/has_many_polymorphs/issues/#issue/3) Je ne suis pas sûr si les relations bilatérales fonctionneraient. Ma compréhension est destinée à une relation parent-polymorphe. c'est-à-dire: au lieu de n'avoir que 'Note' comme parent, je pourrais aussi dire' Post' en tant que parent; ce qui en ferait un polymorphisme double-face. Remarque peut avoir une visionneuse Utilisateur ou Groupe. La publication peut avoir un visualiseur d'utilisateur ou de groupe. La table de relation 'Permission' devrait avoir' authorizable_id' et 'authorizable_type' pour stocker les références' Note' ou 'Post'. – tamersalama

0

@Tamer

Je recevais la même erreur. Le problème était que has_many_polymorphs crée l'enregistrement dans la table de jointure en utilisant l'association de masse et périclite. J'ai ajouté attr_accessible :note_id, :editor_id, et :editor_type à ma classe Permission et cela a fonctionné par la suite. (Note: J'ai substitué les noms de mes modèles aux miens.)

Je n'ai pas trop étudié la question, mais je serais curieux de savoir s'il existe un moyen de modifier ce comportement. Je suis assez nouveau dans ce cadre et laisser quelque chose de sensible (comme une association Order-Payment) être assigné en masse, c'est comme demander de me tirer une balle dans le pied. Faites-moi savoir si cela a réglé votre problème, et si vous trouvez autre chose.

Best,
Steve