代码之家  ›  专栏  ›  技术社区  ›  Mateusz Urbański

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

  •  4
  • Mateusz Urbański  · 技术社区  · 8 年前

    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)
    
    2 回复  |  直到 8 年前
        1
  •  9
  •   Andrey Deineko    8 年前

    您正在使用 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 })
    
        2
  •  1
  •   Pascal    8 年前

    其他人解释了寻找孤儿记录的原因。

    • 首先不应该有孤儿
    • 存在一个 survey.id Survey
    • 那么...怎么样 SurveyGroupList 那是孤儿?

    删除级联时 至配电盘。您还可以添加 dependent: :destroy #destroy 在您的模型上(不是 delete

    推荐文章