皆さん、
これを正しく理解していることを確認したい。ここでは継承のケース (SentientBeing) を無視してください。代わりに has_many :through リレーションシップのポリモーフィック モデルに注目してください。とはいえ、次のことを考慮してください...
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
完璧な世界では、Widget と Person を指定して、次のようなことをしたいと思います。
widget.people << my_person
ただし、これを行うと、widget_groupings で「グルーパー」の「タイプ」が常に null であることに気付きました。ただし、次のような場合:
widget.widget_groupings << WidgetGrouping.new({:widget => self, :person => my_person})
その後、すべてが通常どおりに機能します。これが非ポリモーフィック アソシエーションで発生するのを見たことがないと思います。これがこのユース ケースに固有のものなのか、それとも潜在的にバグを見つめているのかを知りたかっただけです。
助けてくれてありがとう!