2009-11-05 9 views
111

Leute,Active, has_many: durchgehend, und Polymorphe Verbände

Wollen Sie sicher, dass ich das richtig verstehen machen. Und ignorieren Sie hier den Fall der Vererbung (SentientBeing) und versuchen Sie stattdessen, sich auf polymorphe Modelle in has_many: through relationsh zu konzentrieren. Das heißt, betrachten Sie das folgende ...

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 

In einer perfekten Welt, würde Ich mag an, ein Widget und eine Person gegeben, so etwas wie:

widget.people << my_person 

Allerdings, wenn ich tun Ich habe bemerkt, dass der 'Typ' des 'Grouper' in widget_groupings immer null ist. Allerdings, wenn ich sowas wie folgendes mache:

Dann klappt das alles wie ich normalerweise erwartet hätte. Ich glaube nicht, dass ich jemals gesehen habe, dass dies bei nicht polymorphen Assoziationen vorkommt, und ich wollte nur wissen, ob dies etwas Spezifisches für diesen Anwendungsfall ist oder ob ich möglicherweise einen Fehler anstarre.

Danke für jede Hilfe!

Antwort

156

Es gibt eine known issue mit Rails 3.1.1, die diese Funktionalität durchbricht. Wenn Sie dieses Problem zuerst haben, versuchen Sie es zu aktualisieren, es wurde behoben in 3.1.2

Sie sind so nah dran. Das Problem ist, dass Sie die Option: source missbrauchen. : source sollte auf die polymorphe "sounds_to" -Verbindung zeigen. Dann müssen Sie nur Folgendes angeben: source_type für die Beziehung, die Sie definieren möchten.

Diese Lösung für das Widget-Modell sollte es Ihnen ermöglichen, genau das zu tun, wonach Sie suchen.

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 
+0

Oh mein Gott, das ist so schmerzhaft offensichtlich, ich kann nicht glauben, dass ich direkt darüber glee. Danke EmFi! – Cory

+0

Kein Problem, ich glaube, ich habe mich etwa einen Tag dafür gequält, wie ich es beim ersten Mal machen konnte. Hatte nicht geholfen, dass es eines der ersten Dinge war, die ich in Rails versuchte, ohne ein Tutorial/Buch zu folgen. – EmFi

+0

Danke EmFi. – jdl

-3

hat viele: durch und polymorphe funktionieren nicht zusammen. Wenn Sie versuchen, direkt auf sie zuzugreifen, sollte ein Fehler ausgegeben werden. Wenn ich mich nicht irre, muss man widget.people und die Push-Routine schreiben.

Ich glaube nicht, dass es ein Fehler ist, es ist nur etwas, was noch nicht implementiert wurde. Ich könnte mir vorstellen, dass wir es in dem Feature sehen, weil jeder einen Fall hat, in dem er es benutzen könnte.

+5

Sie zusammen arbeiten. Zum Beispiel: has_many: subscriptions,: as =>: abonnierbar has_many: abonnenten,: through =>: subscriptions,: source =>: user – ScottJ

+0

Ich werde ein Beispiel für meinen fehlerhaften Code als separaten Beitrag in der Nähe werfen Zukunft :) Es würde mir viele Kopfschmerzen ersparen, um herauszufinden, wie man diesen Fehler umgehen kann. – cgr

3

Wie oben erwähnt, das funktioniert nicht mit Schienen 3.1.1 aufgrund eines Fehlers auf: Quelle, aber es ist festgelegt in Rails 3.1.2

+0

https://github.com/rails/rails/issues/3271 – EmFi

Verwandte Themen