将named_scope的输出传递给另一个方法

时间:2009-06-26 05:04:05

标签: ruby-on-rails ruby

我在Survey_response.rb模型中使用以下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,on to my function?

我尝试了各种不同的方法,但我不知道隔离相应字段的语法。

2 个答案:

答案 0 :(得分:1)

这种行为可能会更好地放在您的控制器中。无论如何,听起来你需要做的就是收集领域的价值。您可以像这样定义数据:

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

答案 1 :(得分: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]) %>