在我的Ruby on Rails应用程序中,我有以下模型:
class SlideGroup < ApplicationRecord
has_many :survey_group_lists, foreign_key: 'group_id'
has_many :surveys, through: :survey_group_lists
end
我想找到所有孤立的幻灯片组。孤立幻灯片组是幻灯片组,未与任何调查相关联。我一直在尝试跟踪查询,但它没有返回任何内容,我确信我的测试数据库中有孤立的记录:
SlideGroup.joins(:surveys).group("slide_groups.id, surveys.id").having("count(surveys.id) = ?",0)
这将生成以下sql查询:
SlideGroup Load (9.3ms) SELECT "slide_groups".* FROM "slide_groups" INNER JOIN "survey_group_lists" ON "survey_group_lists"."group_id" = "slide_groups"."id" INNER JOIN "surveys" ON "surveys"."id" = "survey_group_lists"."survey_id" GROUP BY slide_groups.id, surveys.id HAVING (count(surveys.id) = 0)
答案 0 :(得分:6)
您正在使用joins
,INNER JOIN
,而您需要的是OUTER JOIN
-
includes
:
SlideGroup.includes(:surveys).group("slide_groups.id, surveys.id").having("count(surveys.id) = ?",0)
更简洁的查询:
SlideGroup.includes(:surveys).where(surveys: { id: nil })
答案 1 :(得分:1)
其他人已经解释了寻找孤儿记录。
我发现这种方法存在问题:
survey.id
的存在并不能保证Survey
SurveyGroupList
怎么样?因此,正确的解决方案是确保DB中没有留下孤儿。通过实现正确的逻辑 AND 将带有的删除级联的外键添加到数据库。您还可以向关联添加dependent: :destroy
选项,但这仅适用于您在模型上使用#destroy
(而非delete
)的情况,如果您通过SQL直接删除,则无效。< / p>