我有一個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
嗯,這很奇怪。你還可以從日誌中爲這兩種情況添加生成的SQL嗎?也許這給出了關於這個問題的線索。我在我自己的一個項目中嘗試了這個項目,該項目有三個模型,它們之間具有'has_many'關係,並且它返回了正確的數字,無論我是否首先將它保存在變量中。在這兩種情況下也會生成相同的SQL。 – Mischa
Update1包含SQL。 Thx – macsig
那麼你的範圍看起來像*完全*?任何條件都與你的問題非常相關。 – Mischa