Sql 如何查询具有3个标记的活动?
我有以下型号: 活动.rb 标记.rb 标记.rb 标记是活动和标记的联接模型 我想搜索具有2个或更多标记的活动。如何在rails中实现这一点 例如: 我有tag1=圣诞节,tag2=佛罗里达,tag3=约翰 我想找到存在tag1、tag2和tag3的活动(如果存在) [编辑] 我最终做了什么:Sql 如何查询具有3个标记的活动?,sql,ruby-on-rails,ruby,ruby-on-rails-3,Sql,Ruby On Rails,Ruby,Ruby On Rails 3,我有以下型号: 活动.rb 标记.rb 标记.rb 标记是活动和标记的联接模型 我想搜索具有2个或更多标记的活动。如何在rails中实现这一点 例如: 我有tag1=圣诞节,tag2=佛罗里达,tag3=约翰 我想找到存在tag1、tag2和tag3的活动(如果存在) [编辑] 我最终做了什么: tags = [tag1, tag2, tag3] activities = [] tags.each do |tag| activities << tag.activities en
tags = [tag1, tag2, tag3]
activities = []
tags.each do |tag|
activities << tag.activities
end
activities.flatten.group_by { |activity| activity.id }
tags=[tag1,tag2,tag3]
活动=[]
标记。每个do |标记|
activities如果您想拥有那些应该存在特定标记的活动,请尝试以下命令
selected_activity = Activity.all.select do |activity|
%w(Christmas Florida John).all? do |name|
activity.tags.include?(name)
end
end
一旦它运行,我们就可以对它进行重构,以减少触发的查询数…不确定,但这应该是实现它的一种性能更好的方法。但应该有更好的办法
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)
这将获得具有这些标记的活动,但它们也可以具有其他标记 如何将tags\u count
字段添加到activities
表中,并像Activity那样进行查询。其中(“tags\u count>=2”)
您只需要那些tag count大于2的活动,或者您想要搜索特定的Comniationshiy!你能检查一下我的答案吗?我在考虑特殊的组合。但你的方法和Aditya的方法都能帮我得到我想要的。我只是想看看怎样才能让它更有效率。谢谢。这会得到我想要的。我必须找到一种方法来获得更少的查询,虽然…我投了更高的票,但它有N+1查询问题。使用Activity.includes(:tags)
还可以检查我的答案,以检查查询中包含的标记,而不是在ruby中进行检查
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)