2013-10-16 134 views
0

我在Rails的一個相當長的SQL查詢:ActiveRecord的SQL查詢輸出

Region.includes(:answers, answers: :choice) 
     .where('choices.id IS NULL OR choices.id = ?', 28) 
     .where('answers.id IS NULL OR answers.question_id = ?', 14) 
     .group("regions.region","choices.choice").count("answers") 

這給了我所有地區的哈希值,與選擇的名稱,並回答計數,甚至當計數爲零。這裏是輸出:

{["East", nil]=>0, ["East Midlands", nil]=>0, ["London", nil]=>0, ["North East", nil]=>0, ["North West", nil]=>0, ["Northern Ireland", nil]=>0, ["Rest of World", "No"]=>3, ["Scotland", nil]=>0, ["South East", nil]=>0, ["South West", nil]=>0, ["Wales", nil]=>0, ["West Midlands", nil]=>0, ["Yorkshire and the Humber", nil]=>0} 

目前唯一有答案的地區是'世界其他地區',顯示選擇名稱'否'。

所有其他項目都顯示'nil'作爲選擇名稱(choices.choice)。如何更改查詢以輸出選擇名稱「否」而不是零,即使沒有與其關聯的答案?

感謝

+0

試試這個? – phoet

+0

去哪個模特?我不確定這會起作用。該查詢正在計算答案。每個答案在創建時都會按region_id分配給定的區域。在創建時,我已經爲該問題提供了默認的「投票」值,但這不是按區域分割的。 –

+0

啊好的,所以關係沒有設置。這不是說在數據庫中有'NULL'作爲'choice.choice'的值嗎? – phoet

回答

0

這很簡單 - 使用的Postgres COALESCE(),它的工作原理,你提供任何數量的參數的方式,能產生非NULL值將被返回的第一個。通過將默認值到數據庫

Region.includes(:answers, answers: :choice) 
     .where('choices.id IS NULL OR choices.id = ?', 28) 
     .where('answers.id IS NULL OR answers.question_id = ?', 14) 
     .group("regions.region","COALESCE(choices.choice, 'No')").count("answers") 
+0

這很好用,可以像'@ choices.choice'中傳遞實例變量而不是字符串'No'嗎? –

+0

忽略該評論。我通過'#{choices.first.choice}'實現了它。將標記爲已接受。謝謝 –

+0

不確定你想傳遞什麼。 @choices來自哪裏? –