ActiveRecord, has_many: through und polymorphe Assoziationen

Leute,

Willst du sicherstellen, dass ich das richtig verstehe? Und ignorieren Sie hier den Fall der inheritance (SentientBeing) und versuchen Sie stattdessen, sich auf polymorphe Modelle in has_many: through relationsh zu konzentrieren. Bedenken Sie Folgendes:

class Widget  :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  grouper has_many :widgets, :through => :widget_groupings end class Alien  grouper has_many :widgets, :through => :widget_groupings end class WidgetGrouping  true end 

In einer perfekten Welt möchte ich, mit einem Widget und einer Person, etwas tun wie:

 widget.people << my_person 

Wenn ich das tue, habe ich bemerkt, dass der ‘Typ’ des ‘Grouper’ in widget_groupings immer null ist. Wenn ich jedoch etwas wie das Folgende habe:

 widget.widget_groupings < self, :person => my_person}) 

Dann funktioniert 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!

Es gibt ein bekanntes Problem mit Rails 3.1.1, das diese functionalität durchbricht. Wenn Sie dieses Problem zuerst haben, versuchen Sie es zu aktualisieren, es wurde in 3.1.2 behoben

Du bist so nah. 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 

Wie oben erwähnt, funktioniert dies nicht mit Rails 3.1.1 aufgrund eines Fehlers auf: source, aber es ist in Rails 3.1.2 behoben

hat viele: durch und polymorph arbeiten 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.