117

皆さん、

これを正しく理解していることを確認したい。ここでは継承のケース (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}) 

その後、すべてが通常どおりに機能します。これが非ポリモーフィック アソシエーションで発生するのを見たことがないと思います。これがこのユース ケースに固有のものなのか、それとも潜在的にバグを見つめているのかを知りたかっただけです。

助けてくれてありがとう!

4

3 に答える 3

162

Rails 3.1.1 には、この機能を壊す既知の問題があります。この問題が発生した場合は、まずアップグレードを試してください。3.1.2 で修正されています。

あなたはとても近いです。問題は、:source オプションを誤用していることです。:source は、ポリモーフィックな belongs_to 関係を指している必要があります。あとは、定義しようとしている関係に :source_type を指定するだけです。

ウィジェット モデルに対するこの修正により、探していることを正確に実行できるようになります。

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
于 2009-11-05T23:53:37.717 に答える
3

上記のように、これは :source のバグにより Rails 3.1.1 では機能しませんが、Rails 3.1.2 では修正されています。

于 2011-12-04T13:02:06.207 に答える
-4

多くの :through とポリモーフィックは一緒に機能しません。それらに直接アクセスしようとすると、エラーが発生するはずです。私が間違っていなければ、widget.people とプッシュ ルーチンを手書きする必要があります。

これはバグではなく、まだ実装されていないものだと思います。誰もがそれを使用できるケースを持っているので、機能でそれを見ると思います.

于 2009-11-05T23:21:51.473 に答える