私は次のものが欲しいです:
class Foo < AR
has_many :taggings
has_many :tags, :through => :taggings
end
class Bar < AR
has_many :taggings
has_many :tags, :through => :taggings
end
class Tagging < AR
belongs_to :tag
belongs_to :taggable, :polymorphic => true
belongs_to :user # etc
end
class Tag < AR
has_many :taggings
has_many :taggables, :through => :taggings
end
Tag.first.taggables # => [Bar:43, Foo:52, Foo:59, Bar:59, Foo:123, ...]
特に、、などを指定する必要はありません。これは、関連する質問で参照されている:source /:source_typeメソッドであり、問題があります。Tag.foo_taggables
Tag.bar_taggables
異種オブジェクトの配列で正しく機能するようにしたいと思います。はい、私はそれらがすべて同じ特性を持っているわけではないことを理解しています。それは問題ないはずです(私が扱っている種類を気にせずに、すべてのタグ付け可能なものが共有するインターフェースに頼ることができるはずです)。
特に、たとえばtag.taggable_idsは、int idの配列だけでなく、id/typeタプルの配列である必要があります。
ここでは例としてタグを使用しています。実際の問題には別のシナリオがありますが、ポリモーフィックhas_many:throughの同じ本質的な問題があります。
Rails 2には、これを実現するプラグインhas_many_polymorphsがありましたが、機能していません。クロンのフォークは機能していないようです。Rails 3でこれを取得するための機能する方法はありますか?