活动记录 - 查找其关联计数为 0 的记录



在我的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)

你正在使用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 })

其他人已经解释了查找孤立记录。

我看到这种方法存在问题:

  • 首先不应该有任何孤儿
  • survey.id的存在并不能保证Survey的存在
  • 孤儿
  • SurveyGroupList呢?

因此,正确的解决方案是确保数据库中没有孤儿。通过实现正确的逻辑并将外键添加到数据库。您也可以dependent: :destroy选项添加到关联中,但这仅在模型上使用#destroy时才有效(不是delete(,当然,如果您直接通过SQL删除,则不起作用。

最新更新