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,将找到该项目,所有条件都将匹配。它在这里做错了,这是一个假阳性。