2009-06-11 8 views
0

Ich versuche, mehrere polymorphe Beziehungen (has_many_polymorphs plugin) von einem einzigen Elternteil zu gleichen Kindern zu definieren.Mehrere has_many_polymorphs in einem Modell

Hinweis hat viele Zuschauer
Hinweis hat viele Redakteure
Zuschauer entweder Benutzer sein könnte oder Gruppen
Editoren entweder Benutzer sein könnte oder Gruppen
Permission ist das Assoziationsmodell mit note_id, viewer_id, viewer_type, editor_id, editor_type Felder

Alles klappt wie so lange erwarten, wie ich nur eine has_many_polymorphs Beziehung in Anmerkung Modell

definiert haben

Starten Sie nun Probleme erscheinen, wenn ich die zweite Beziehung

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' 

Ich habe versucht, die Verfeinerung der Definition von has_many_polymorphs hinzufügen, aber es hat nicht funktioniert. Nicht einmal mit einem STI-Modell für ViewPermission < Permission und EditPermission < Permission.

Alle Gedanken/Workarounds/Problem Zeiger sind willkommen.

Rails 2.3.0

+0

Ich glaube, Sie brauchen etwas Interpunktion in Ihrem zweiten Absatz hinzufügen ... –

Antwort

0

Dont müssen Sie

has_many :permissions 

zu Ihrer Nachricht hinzuzufügen. FYI. Ich benutzte has_many_polymorphs einmal, aber dann fiel es, es funktionierte nicht wie erwartet.

Können Sie das für die Berechtigung verwendete Schema posten? Meine Vermutung ist die Wurzel des Problems liegt dort, müssen Sie mehrere Typ, ID-Paare im Schema haben, da Sie zwei verschiedene belongs_to in der Definition haben.

Edit:

Ich sehe Sie die Frage auf Github auch gebucht haben. Nicht sicher, ob Sie den doppelseitigen Polymorphismus ausprobiert haben. Sie haben wahrscheinlich ... wie ich schon sagte, ich war von diesem Plugin nicht beeindruckt, da es zu Instabilität kam, wenn ich es benutzte.

== 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

Die 'has_many: permissions' ist nicht erforderlich. Das Schema wie im zweiten Absatz umrissen ist: integer: note_id integer: VIEWER_ID String \t: viewer_type integer: editor_id String \t: editor_type – tamersalama

+0

Dank Ryan - ja - ich gepostet auf GitHub als Thema (http://github.com/fauna/has_many_polymorphs/issues/#issue/3) Ich bin mir nicht sicher, ob doppelseitige Beziehungen funktionieren würden. Mein Verständnis ist für eine polymorphe Elternbeziehung gedacht. dh: anstatt nur "Note" als Elternteil zu haben, könnte ich auch "Post" als Elternteil sagen; was es zu einem doppelseitigen Polymorphismus machen würde. Hinweis kann entweder Benutzer oder Gruppenbetrachter haben. Beitrag kann Benutzer oder Gruppenbetrachter haben. Die Beziehungstabelle "Permission" müsste "authorizable_id" und "autorizable_type" haben, um entweder "Note" - oder "Post" -Referenzen zu speichern. – tamersalama

0

@Tamer

ich die gleichen Fehler. Das Problem war, dass has_many_polymorphs den Datensatz in der Join-Tabelle mithilfe der Massenassoziation erstellt und fehlgeschlagen ist. Ich fügte attr_accessible :note_id, :editor_id, und :editor_type meiner Klasse Permission hinzu und es arbeitete danach. (Hinweis: Ich habe Ihre Modellnamen für meine ersetzt.)

Ich habe nicht zu viel darüber nachgedacht, aber ich wäre neugierig, ob es eine Möglichkeit gibt, dieses Verhalten zu ändern. Ich bin ziemlich neu in diesem Rahmen, und etwas Sensibles (wie eine Order-Payment-Assoziation) massenhaft zu lassen, scheint zu fragen, ob ich mich selbst in den Fuß schießen soll. Lass mich wissen, ob das dein Problem behoben hat und ob du noch etwas anderes herausgefunden hast.

Best,
Steve

Verwandte Themen