2009-06-24 85 views
2

我在Ruby on Rails應用程序中構建了一個報表,我正在努力理解如何使用子查詢。Rails報表生成中的子查詢

每個'調查'has_many'SurveyResponses',它很容易檢索這些,但我需要根據其中一個字段'jobcode'進行分組,因爲我只想報告與單個職位代碼相關的信息在報告的一行中。

但是,我還需要知道構成該職位代碼總數的組成數據。原因是我需要計算中位數和標準差等數據,因此需要知道總數的值。

我的想法是,我檢索調查報告的不同工作代碼,然後當我循環瀏覽這些檢索每個工作代碼的單個回覆。

這是做到這一點的正確方法還是應該遵循不同的方法?

回答

2

你可以使用一個命名範圍,簡化得到的答覆組:

named_scope :job_group, lambda{|job_code| {:conditions => ["job_code = ?", job_code]}} 

假如把它放在你的反應模型,A和使用它像這樣:

job.responses.job_group('some job code') 

,你會得到一系列的迴應。如果你希望得到的響應中的一個屬性的值的平均值,則可以使用地圖:

r = job.responses.job_group('some job code') 
r.map(&:total) 
=> [1, 5, 3, 8] 

或者,你可能會發現它更快地編寫自定義的SQL,以獲得屬性組的平均值/平均值/總和。通過這種工作的軌道可能會導致嚴重的滯後。

ActiveRecord::Base.connection.execute("Custom SQL here") 
1

您還可以使用Model.find_by_sql()

例如:

class User < Activerecord::Base 
    # Your usual AR model 
end 

...

def index 
    @users = User.find_by_sql "select * from users" 
    # etc 
end