2017-07-19 53 views
1

在我的Ruby on Rails應用程序,我有以下型號:ActiveRecord的 - 查找記錄,它的關聯計數爲0

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) 
+1

這裏你需要一個'outer join',因爲'inner join'不會返回孤兒。 – mudasobwa

回答

2

你」重新使用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 }) 
+4

Rails 5還增加了一個'left_outer_joins'方法 - https://github.com/rails/rails/pull/12071 –

1

查找孤兒記錄已被其他人解釋。

我看到這種方法的問題:

  • 不應有擺在首位任何孤兒
  • 一個survey.id的存在並不能保證有關SurveyGroupListSurvey
  • 什麼存在即是孤兒嗎?

所以適當的解決方案是確保沒有孤兒留在數據庫中。通過執行適當的邏輯的外鍵添加到數據庫中刪除級聯。您還可以將dependent: :destroy選項添加到您的關聯中,但只有在模型上使用#destroy(而不是delete)時纔可使用,如果直接通過SQL刪除,則此功能當然不起作用。

相關問題