Orang-orang,
Ingin memastikan saya memahami ini dengan benar. Dan tolong abaikan kasus untuk warisan di sini (SentientBeing), mencoba untuk fokus pada model polimorfik dalam has_many: melalui hubungan. Karena itu, pertimbangkan yang berikut ...
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
Di dunia yang sempurna, saya ingin, dengan Widget dan Orang, melakukan sesuatu seperti:
widget.people << my_person
Namun, ketika saya melakukan ini, saya perhatikan 'type' dari 'grouper' selalu null di widget_groupings. Namun, jika saya ke sesuatu seperti berikut:
widget.widget_groupings << WidgetGrouping.new({:widget => self, :person => my_person})
Kemudian semua bekerja seperti yang biasanya saya harapkan. Saya rasa saya belum pernah melihat ini terjadi dengan asosiasi non polimorfik dan hanya ingin tahu apakah ini adalah sesuatu yang spesifik untuk kasus penggunaan ini atau apakah saya berpotensi melihat bug.
Terima kasih atas bantuannya!
Seperti disebutkan di atas, ini tidak berfungsi dengan rails 3.1.1 karena bug di: source, tetapi diperbaiki di Rails 3.1.2
sumber
memiliki banyak: melalui dan polimorfik tidak bekerja sama. Jika Anda mencoba mengaksesnya secara langsung, itu akan menimbulkan kesalahan. Jika saya tidak salah, Anda harus menulis widget.people secara manual dan rutinitas push.
Menurut saya ini bukan bug, ini hanya sesuatu yang belum diimplementasikan. Saya membayangkan kami melihatnya di fitur, karena setiap orang memiliki casing di mana mereka dapat menggunakannya.
sumber