ruby-on-rails - Rails/ActiveRecord:如何在一个表中找到指向另一个匹配所有指定列值的行的行?
问题描述
我有名为Issue
and的模型Label
。每个issue
可以有很多labels
。每个label
可以有很多issues
。
我正在尝试构建一个查询,该查询将返回一个包含所有提供的标签的问题。
例如,如果我提供['bug', 'fix', 'enhancement']
我想要的问题至少具有这三个标签中的所有三个标签。
目前,我有:
labels = ['bug', 'fix', 'enhancement']
Issue.joins(:labels).where(labels: { name: labels }).distinct
但这还不够,因为它返回的问题至少有一个标签名称。我看到这是因为生成了“IN”运算符:
WHERE "labels"."name" IN ('bug', 'fix', 'enhancement')
从这里开始,我迷路了。labels
数组可以是任意长度。我可以在单个查询中得到我想要的结果吗?
如何在一个表中找到指向另一个与所有指定列值匹配的行的行?
解决方案
我没有检查它,但也许这种方法可以工作
Issue.select('issues.id, count(labels.id) as cnt').includes(:labels).where(labels: { name: labels }).group('issues.id').having("cnt = #{labels.size}");