2009-06-26 38 views
0

我的報告中,在我的survey_response.rb模型以下named_scope檢索個別行數據:傳遞named_scope的輸出到另一個方法

named_scope :job_responses, lambda{|job_code, survey_code| {:conditions => ["survey_job_id = ? AND survey_id = ?", job_code, survey_code]}} 

檢查日誌,我可以看到我的SQL查詢被執行如預期。查詢返回一份工作調查的個人答覆清單,主要包括我需要進行計算的數字數據。具體而言,我需要將某些字段的內容傳遞給另一個獲取特定字段中數據的標準偏差的方法,但我不明白如何執行此操作。

<%= survey_response.standard_deviation([array here]) %> 

目前我對報告中的每一行觀點我檢索適用於該行的數據如下:

由於外部方法被稱爲

<% r = SurveyResponse.job_responses(survey_response.id, survey_response.survey_id) %> 

我的問題,因此是我如何從返回的named_scope數據發送特定字段的結果,例如:base_pay,我的函數?

我已經嘗試了各種不同的方法,但我不知道隔離相應字段的語法。

回答

1

這種行爲可能會更好地放在你的控制器。無論如何,這聽起來像你需要做的就是收集該字段的值。你可以定義數據是這樣的:

@job_responses = SurveyResponse.job_responses(survey_response.id, survey_response.survey_id) 
@base_pay = @job_responses.collect {|response| response.base_pay} 
+0

感謝您的反饋意見。我想它應該在控制器中,但我無法解決問題。 我已經在SurveyResponses上找到了模型中的多個結果,以查找調查中存在哪些作業 - 所以這必須在該循環內部。 我真的不明白如何使用現有查找的結果進行查找。 – simonyoung 2009-06-26 11:18:04

1

你的核心問題,如何找回數據的特定領域,是像這樣處理的:

response = SurveyResponse.job_responses(a,b).first 
response.base_pay 

我從你的評論猜測你會從分手named_scope聲明中獲益 - 事實上,你並不需要named_scope來做到這一點。 Rails提供魔術find_all_by_x_and_y method

假設您想循環使用所有調查並抽出所有調查代碼。你的代碼可能是像這樣:

def base_pay_by_survey_and_job 
    surveys = Survey.all 
    pay_grades = {} 
    surveys.each do |survey| 
    responses = SurveyResponse.find_all_by_survey_id(survey.id) 
    jobs_included = responses.map { |sr| sr.survey_job_id }.uniq 
    pay_grades[survey.id] = jobs_included.inject({}) do |pay_by_job, job_code| 
     job_responses = responses.select { |sr| jobs_included.include?(sr.survey_job_id) } 
     pay_by_job[job_code] = job_responses.map { |jr| jr.base_pay } 
     pay_by_job 

    end 
    end 
    pay_grades 
end 

有一定的方法來更好地優化這個代碼,但它的速度不夠快,應該很容易理解。你可以把它放在幫助器中,然後從視圖中引用它。例如,如果您想在同一調查中比較單個受訪者與具有相同工作代碼的所有其他受訪者的功能,可以這樣做:

<% pay_grades = base_pay_by_survey_and_job %> 
<%= survey_response.standard_deviation(pay_grades[survey_response.survey_id][survey_response.survey_job_id]) %> 
相關問題