Ludzie,
Chcę się upewnić, że dobrze to rozumiem. I proszę zignoruj tutaj przypadek dziedziczenia (SentientBeing), próbując zamiast tego skupić się na modelach polimorficznych w has_many: poprzez relacje. To powiedziawszy, rozważ następujące ...
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
W idealnym świecie chciałbym, mając widżet i osobę, zrobić coś takiego:
widget.people << my_person
Jednak kiedy to robię, zauważyłem, że 'typ' 'groupera' jest zawsze pusty w widget_groupings. Jeśli jednak dojdę do czegoś takiego:
widget.widget_groupings << WidgetGrouping.new({:widget => self, :person => my_person})
Wtedy wszystko działa tak, jak bym się normalnie spodziewał. Nie sądzę, żebym kiedykolwiek widział, jak to się dzieje w przypadku skojarzeń niepolimorficznych i po prostu chciałem wiedzieć, czy było to coś specyficznego dla tego przypadku użycia, czy też potencjalnie wpatruję się w błąd.
Dzięki za pomoc!
Jak wspomniano powyżej, nie działa to z railsami 3.1.1 z powodu błędu w: source, ale zostało to naprawione w Railsach 3.1.2
źródło
ma wiele: na wskroś i polimorficzne nie działają razem. Jeśli spróbujesz uzyskać do nich bezpośredni dostęp, powinien wyświetlić błąd. Jeśli się nie mylę, musisz ręcznie napisać widget.people i procedurę push.
Nie sądzę, żeby to był błąd, to po prostu coś, czego jeszcze nie zaimplementowano. Wyobrażam sobie, że widzimy to w funkcji, ponieważ każdy ma przypadek, w którym mógłby go użyć.
źródło