1

私は次のものが欲しいです:

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_taggablesTag.bar_taggables

異種オブジェクトの配列で正しく機能するようにしたいと思います。はい、私はそれらがすべて同じ特性を持っているわけではないことを理解しています。それは問題ないはずです(私が扱っている種類を気にせずに、すべてのタグ付け可能なものが共有するインターフェースに頼ることができるはずです)

特に、たとえばtag.taggable_idsは、int idの配列だけでなく、id/typeタプルの配列である必要があります。

ここでは例としてタグを使用しています。実際の問題には別のシナリオがありますが、ポリモーフィックhas_many:throughの同じ本質的な問題があります。

Rails 2には、これを実現するプラグインhas_many_polymorphsがありましたが、機能していません。クロンのフォークは機能していないようです。Rails 3でこれを取得するための機能する方法はありますか?

4

1 に答える 1

0

#buildを使用して熱心にロードする必要がない場合、.includeまたはそのような派手なものが必要ない場合は、関連付けの代わりに単純なメソッドを使用できます。

class Tag < AR
  has_many :taggings

  def taggables
    taggings.includes(:taggables).flat_map(&:taggables).uniq
  end
end
于 2012-10-06T03:23:39.617 に答える