6

私は次のモデルを持っています:

アクティビティ.rb

タグ.rb

tagging.rb

タグ付けは、アクティビティとタグの結合モデルです。

2 つ以上のタグを持つアクティビティを検索したいと考えています。レールでこれを行うにはどうすればよいですか?

例えば:

tag1 = クリスマス、tag2 = フロリダ、tag3 = ジョン

存在する場合、tag1、tag2、およびtag3が存在するActivityを見つけたいです。

[編集]

私がやったこと:

tags = [tag1, tag2, tag3]

activities = []
tags.each do |tag|
  activities << tag.activities
end

activities.flatten.group_by { |activity| activity.id }

グループ値のサイズのいずれかが tags.size と等しい場合、そのアクティビティにはすべてのタグが含まれます。

4

3 に答える 3

3

特定のタグが存在するアクティビティが必要な場合は、次のコマンドを試してください。

selected_activity = Activity.all.select do |activity|
                      %w(Christmas Florida John).all? do |name|
                        activity.tags.include?(name)
                      end 
                    end

実行したら、いつでもリファクタリングして、実行されるクエリの数を減らすことができます...

于 2012-10-27T06:41:28.653 に答える
1

確かではありませんが、これはそれを達成するためのより優れたパフォーマンスの方法であるはずです。しかし、もっと良い方法があるはずです

tags_ids = [tag1, tag2, tag3].map(&:id)
ativities_ids = Tagging.where(tag_id: tags_ids).group("activity_id having count(tag_id) = #{tags_ids.size}").select('activity_id').map(&:activity_id)
Activity.find(activities_id)

これにより、これらのタグを持つアクティビティが取得されますが、他のタグを持つこともできます。

于 2012-10-27T16:10:45.783 に答える
1
  Activity.includes(:tags).select{ |act| act.tags.size> 2}
于 2012-10-27T05:58:18.667 に答える