我有名为Issue
和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
数组可以是任意长度。我可以在一个查询中得到想要的结果吗?
如何查找表中的行,该行指向另一个表中与所有指定列值匹配的行?
答案 0 :(得分:1)
我没有检查它,但也许这种方法可行
Issue.select('issues.id, count(labels.id) as cnt').includes(:labels).where(labels: { name: labels }).group('issues.id').having("cnt = #{labels.size}");