Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何查询具有3个标记的活动?_Sql_Ruby On Rails_Ruby_Ruby On Rails 3 - Fatal编程技术网

Sql 如何查询具有3个标记的活动?

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

我有以下型号:

活动.rb

标记.rb

标记.rb

标记是活动和标记的联接模型

我想搜索具有2个或更多标记的活动。如何在rails中实现这一点

例如:

我有tag1=圣诞节,tag2=佛罗里达,tag3=约翰

我想找到存在tag1、tag2和tag3的活动(如果存在)

[编辑]

我最终做了什么:

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)