【发布时间】:2013-10-12 19:09:11
【问题描述】:
我想要相当于 SO 按标签搜索,所以我需要一个 exists 查询,但我仍然需要在所有标签上左连接。我已经尝试了几种方法,但我没有想法。
Qustion - Tag 关系通过has_and_belongs_to_many 两种方式(即我有一个 QuestionTags 连接器表)
例如
Question.join(:tags).where('tag.name = ?', tag_name).includes(:tags)
我希望这能满足我的需要,但实际上它只是将 includes 与 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 混淆了:
弃用警告:您似乎急于加载表(一个 of: questions, tags) 在字符串 SQL sn ippet 中引用。为了 示例:
Post.includes(:comments).where("comments.title = 'foo'")
请注意,我正在尝试将这些写为命名范围。
如果问题不清楚,请告诉我。提前致谢。
【问题讨论】:
-
说实话我很困惑为什么内部连接对你来说不够好,你能详细说明一下为什么加入标签对你不起作用吗?
-
@EdgarsJekabsons 因为我需要显示带有特定标签的所有问题的列表,但在该列表中我仍然需要显示每个问题的所有标签,避免 N+1 查找。例如。单击上面的
sql标签以查看满足我需要的 SO 页面。只有内部连接,页面只会在每个问题下显示sql标签。
标签: sql ruby-on-rails sqlite activerecord arel