0

タグ付け可能な has_many タグのモデルがあるとします。関連付けられたタグの taggable_id フィールドですべてのタグ付け可能なものを見つけるにはどうすればよいですか?

Taggable.find(:all, :joins => :tags, :conditions => {:tags => {:taggable_id => [1,2,3]}})

結果は次のようになります。

SELECT `taggables`.* FROM `taggables` INNER JOIN `tags` ON tags.taggable_id = taggables.id WHERE (`tag`.`taggable_id` IN (1,2,3))

構文は信じられないほどですが、結果の sql がタグの一部、またはすべてを持つタグ付け可能なものを返すという点で、私のニーズには合いません。

フィールド taggable_id の値が 1、2、および 3 の関連タグを持つタグ可能オブジェクトを見つけるにはどうすればよいですか?

アドバイスをありがとう。:)

アップデート:

他の人がここにたどり着いた場合に投稿する解決策を見つけました。また、改善のための提案を喜んで受け取る他の人の注意も必要です。:)

Taggable.find(:all, :joins => :tags, :select => "taggables.*, tags.count tag_count", :conditions => {:tags => {:taggable_id => array_of_tag_ids}}, :group => "taggables.id having tag_count = #{array_of_tag_ids.count}"))
4

1 に答える 1

0

あなたの質問は少し混乱しています(「タグ」はかなり使われているようです:))が、私がここで必要としていたのと同じものが欲しいと思います:

Taggable.find([1,2,3], :include => :tags).tags.map { |t| t.taggables }

または(結果を一意にしたい場合は、おそらくそうします):

Taggable.find([1,2,3], :include => :tags).tags.map { |t| t.taggables }.flatten.uniq

これにより、ID 1、2、および 3 を持つタグ付け可能オブジェクトと同じタグを持つすべてのタグ付け可能オブジェクトが取得されます。これでよろしいですか?

于 2010-04-02T17:00:41.060 に答える