Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.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
Ruby on rails 如何基于多个关联进行过滤?_Ruby On Rails_Postgresql_Activerecord - Fatal编程技术网

Ruby on rails 如何基于多个关联进行过滤?

Ruby on rails 如何基于多个关联进行过滤?,ruby-on-rails,postgresql,activerecord,Ruby On Rails,Postgresql,Activerecord,我有三种型号 计划 class Project < ApplicationRecord has_many :taggings has_many :tags, through: :taggings end 标记 class Tagging < ApplicationRecord belongs_to :tag belongs_to :project end 标签 简言之,项目有许多标记 我想找出所有给定标签的项目。我的输入是一个标签ID数组,例如[1,3,5]。我试

我有三种型号

计划

class Project < ApplicationRecord
  has_many :taggings
  has_many :tags, through: :taggings
end
标记

class Tagging < ApplicationRecord
  belongs_to :tag
  belongs_to :project
end
标签

简言之,项目有许多标记

我想找出所有给定标签的项目。我的输入是一个标签ID数组,例如[1,3,5]。我试过了 Project.joins:tags.wheretags:{id:[1,3,5]} 但它会查找具有id为[1,3,5]的其中一个标记的项目。我正在寻找的项目有所有的输入标签。我该怎么做

tags = [1, 3, 5]
projects = Project.joins(:tags)
                  .where(tags: {id: tags})
                  .group(:id)
                  .having('COUNT(tags) = ?', tags.size)
这将返回包含所有三个标记的项目


这将返回包含所有三个标记的项目。

您正在查找包含查询:

选择p* 来自项目p p.id=t.project\u id上的内部连接标记t 按p.id分组 按t.tag_id@>array[1,3,5]排列array_aggt.tag_id顺序; 这将返回具有所有给定标记但不限于这些标记的所有项目。i、 e.如果一个项目有标签1、3、5、7,它将被返回给。但这不是一个

有几个条件:

数组[1,3,5]必须排序 p、 实际上是projects.id的id必须:a是主键,或者b附加了唯一性约束。 这样做的好处是查询非常灵活——您可以更改操作以快速更改含义。比方说,您现在可以编写一个只返回这些标记的项目,而不是返回所有这些标记的项目

考虑以下数据集:

projects:

id  name
1   guttenberg
2   x
3   aristotle


tags:

id  name
1   books
2   teams
3   management
4   library
5   movie

taggings:

id  project_id  tag_id
1   1   1
2   1   3
3   1   5
4   2   1
5   2   3
6   3   4
7   3   5
如果要查询1、3,则应该得到项目1和项目2

可使用的SQL小提琴:

等效活动记录:

标记ID=[1,5,3]。排序条件1 项目= Project.joins:标记不需要标记 .组:id .havingarray_agggings.tag_id按taggings.tag_id@>数组[?],tag_id排序
您正在查找包含查询:

选择p* 来自项目p p.id=t.project\u id上的内部连接标记t 按p.id分组 按t.tag_id@>array[1,3,5]排列array_aggt.tag_id顺序; 这将返回具有所有给定标记但不限于这些标记的所有项目。i、 e.如果一个项目有标签1、3、5、7,它将被返回给。但这不是一个

有几个条件:

数组[1,3,5]必须排序 p、 实际上是projects.id的id必须:a是主键,或者b附加了唯一性约束。 这样做的好处是查询非常灵活——您可以更改操作以快速更改含义。比方说,您现在可以编写一个只返回这些标记的项目,而不是返回所有这些标记的项目

考虑以下数据集:

projects:

id  name
1   guttenberg
2   x
3   aristotle


tags:

id  name
1   books
2   teams
3   management
4   library
5   movie

taggings:

id  project_id  tag_id
1   1   1
2   1   3
3   1   5
4   2   1
5   2   3
6   3   4
7   3   5
如果要查询1、3,则应该得到项目1和项目2

可使用的SQL小提琴:

等效活动记录:

标记ID=[1,5,3]。排序条件1 项目= Project.joins:标记不需要标记 .组:id .havingarray_agggings.tag_id按taggings.tag_id@>数组[?],tag_id排序
这里我错了,查询没有获取正确的项目。我在代码中使用了array contains方法。你为什么认为这不管用?它在一些测试中为我提供了准确的结果。数组方法有效,但我的建议无效。对于具有4个标记ID的项目:1、3、5和7,筛选标记1、3、5和count=3,将找到该项目,所有条件都将匹配。它在这里做了错误的事情,这是一个误判。我在这里错了,查询没有获取正确的项目。我在代码中使用了数组包含方法。你为什么认为这不管用?它在一些测试中为我提供了准确的结果。数组方法有效,但我的建议无效。对于具有4个标记ID的项目:1、3、5和7,筛选标记1、3、5和count=3,将找到该项目,所有条件都将匹配。它在这里做错了,这是一个假阳性。