Leute,
Ich möchte sicherstellen, dass ich das richtig verstehe. Und bitte ignorieren Sie den Fall der Vererbung hier (SentientBeing) und versuchen Sie stattdessen, sich auf polymorphe Modelle in has_many zu konzentrieren: durch Beziehungen. Beachten Sie jedoch Folgendes ...
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 möchte ich mit einem Widget und einer Person etwas tun wie:
widget.people << my_person
Dabei habe ich jedoch festgestellt, dass der 'Typ' des 'Grouper' in widget_groupings immer null ist. Allerdings, wenn ich zu so etwas wie folgendem komme:
widget.widget_groupings << WidgetGrouping.new({:widget => self, :person => my_person})
Dann funktioniert alles so, wie ich es normalerweise erwartet hätte. Ich glaube nicht, dass ich dies jemals bei nicht polymorphen Assoziationen gesehen habe und wollte nur wissen, ob dies etwas Spezielles für diesen Anwendungsfall ist oder ob ich möglicherweise auf einen Fehler starre.
Vielen Dank für jede Hilfe!
Wie oben erwähnt, funktioniert dies mit Rails 3.1.1 aufgrund eines Fehlers in: source nicht, ist jedoch in Rails 3.1.2 behoben
quelle
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, müssen Sie widget.people und die Push-Routine von Hand schreiben.
Ich denke nicht, dass es ein Fehler ist, es ist nur etwas, das noch nicht implementiert wurde. Ich würde mir vorstellen, dass wir es in der Funktion sehen, weil jeder einen Fall hat, in dem er es verwenden könnte.
quelle