6

我有以下型号:

活动.rb

标签.rb

标记.rb

标记是活动和标记的连接模型。

我想搜索具有 2 个或更多标签的 Activity。我如何在rails中做到这一点?

例如:

我有 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
  Activity.includes(:tags).select{ |act| act.tags.size> 2}
于 2012-10-27T05:58:18.667 回答
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 回答