我想要按标签搜索的等价物,所以我需要一个exists
查询,但我仍然需要在所有标签上留下连接。我尝试了几种方法,但我没有想法。
Qustion - Tag 关系是通过has_and_belongs_to_many
两种方式(即我有一个 QuestionTags joiner 表)
例如
Question.join(:tags).where('tag.name = ?', tag_name).includes(:tags)
我希望这能满足我的需要,但实际上它只是将 theincludes
与 the混合在一起,join
而我最终基本上得到了一个内部连接。
Question.includes(:tags)
.where("exists (
select 1 from questions_tags
where question_id = questions.id
and tag_id = (select id
from tags
where tags.name = ?))", tag_name)
这会获取正确的结果,但是 a) 真的很难看,并且 b) 给出了弃用警告,因为它似乎又将 与 混淆includes
了join
:
弃用警告:看起来您正在急切地加载在字符串 SQL sn ippet 中引用的表(其中之一:问题、标签)。例如:
Post.includes(:comments).where("comments.title = 'foo'")
注意我正在尝试将这些写为命名范围。
如果问题不清楚,请告诉我。提前致谢。