1

我有一個3個簡單的模型,我們稱之爲Sector,Department,Office。 部門有很多部門和部門有很多辦事處。使用雙深關聯記錄獲取記錄

現在我想要獲得至少有一個部門至少有一個辦公室的所有部門。

我嘗試了幾種不同的方式,他們「或多或少」的工作。我的意思是,如果我調用Sector.with_offices,我會得到我想要的結果。但是,如果我鏈接了一些相當常用的方法,例如.size(即向原始查詢添加計數),我會得到意想不到的結果。在這裏我曾嘗試:

scope :with_offices, joins(:departments => :offices).group('sectors.id') 
scope :with_offices, joins(:departments => :offices).select("DISTINCT sectors.*") 

我也使用uniq嘗試:

scope :with_offices, joins(:departments => :offices).uniq 

但是,它有同樣的問題。

Sector.with_offices.size # => 5 (WRONG VALUE) 
s = Sector.with_offices # => [#<Sector ... >] 
s.size # => 3 (RIGHT VALUE) 

如果我鏈的大小,我得到了錯誤的數字。

什麼是乾淨的方式來獲得辦公室的部門,並保持大小按預期工作?

更新1 - SQL查詢 在這裏我的查詢,我忘了提及,兩個協會有一個條件的條款限制在國家(如下圖所示)。

irb(main):010:0> Sector.with_offices.size 
    (0.6ms) SELECT DISTINCT COUNT(*) FROM "sectors" INNER JOIN "departments" ON "departments"."sector_id" = "sectors"."id" AND departments.state IN ('active', 'deactivated') INNER JOIN "offices" ON "offices"."department_id" = "departments"."id" AND offices.state IN ('active', 'deactivated') WHERE "sectors"."state" IN ('active', 'deactivated') 
=> 5 


irb(main):011:0> s = Sector.with_offices 
    Sector Load (0.6ms) SELECT DISTINCT "sectors".* FROM "sectors" INNER JOIN "departments" ON "departments"."sector_id" = "sectors"."id" AND departments.state IN ('active', 'deactivated') INNER JOIN "offices" ON "offices"."department_id" = "departments"."id" AND offices.state IN ('active', 'deactivated') WHERE "sectors"."state" IN ('active', 'deactivated') 

更新2 - 協會

Class Sector < ActiveRecord::Base 
has_many :departments , conditions: ["departments.state IN ('active', 'deactivated')"] 
end 

Class Department < ActiveRecord::Base 
has_many :offices , conditions: ["offices.state IN ('active', 'deactivated')"] 
end 
+0

嗯,這很奇怪。你還可以從日誌中爲這兩種情況添加生成的SQL嗎?也許這給出了關於這個問題的線索。我在我自己的一個項目中嘗試了這個項目,該項目有三個模型,它們之間具有'has_many'關係,並且它返回了正確的數字,無論我是否首先將它保存在變量中。在這兩種情況下也會生成相同的SQL。 – Mischa

+0

Update1包含SQL。 Thx – macsig

+0

那麼你的範圍看起來像*完全*?任何條件都與你的問題非常相關。 – Mischa

回答

1

我嘗試過了,這是在3.2.12中的錯誤,這顯然已經固定3.2.13。如果升級到3.2.13,則會生成正確的SQL。

+0

謝謝。我會盡快完成。 – macsig

+0

@macsig - 謝謝! – Mischa