Передача вывода named_scope в другой метод - PullRequest
0 голосов
/ 26 июня 2009

Я получаю данные по отдельным строкам в отчете со следующим named_scope в моей модели survey_response.rb:

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, в мою функцию?

Я пробовал разные способы, но я не знаю синтаксиса для выделения соответствующего поля.

Ответы [ 2 ]

1 голос
/ 07 июля 2009

Ваш основной вопрос о том, как вернуть данные для определенного поля, обрабатывается так:

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

Я предполагаю, что из ваших комментариев вы выиграете, если разберете свою декларацию named_scope - на самом деле вам не нужен named_scope для этого. Рельсы снабжают магией 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]) %>
1 голос
/ 26 июня 2009

Такое поведение, вероятно, лучше разместить в вашем контроллере. В любом случае, похоже, все, что вам нужно сделать, это собрать значения поля. Вы можете определить данные следующим образом:

@job_responses = SurveyResponse.job_responses(survey_response.id, survey_response.survey_id)
@base_pay = @job_responses.collect {|response| response.base_pay}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...