我有以下型号:
activity.rb
tag.rb
tagging.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,则该活动包含所有标记。
答案 0 :(得分:3)
如果您希望将特定标签存在的活动存在,请尝试以下命令
selected_activity = Activity.all.select do |activity|
%w(Christmas Florida John).all? do |name|
activity.tags.include?(name)
end
end
一旦运行,我们总是可以重构它,以减少被触发的查询数量......
答案 1 :(得分:1)
Activity.includes(:tags).select{ |act| act.tags.size> 2}
答案 2 :(得分: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)
这将获得具有这些标记的活动,但也可以包含其他标记。