Как собрать и объединить несколько массивов для расчета? - PullRequest
0 голосов
/ 26 июня 2009

Я собираю значения для определенного столбца из named_scope следующим образом:

a = survey_job.survey_responses.collect(&:base_pay)

Это дает мне числовой массив, например (1,2,3,4,5). Затем я могу передать этот массив в различные функции, которые я создал, чтобы получить среднее значение, медиану, стандартное отклонение набора чисел. Все это работает нормально, однако теперь мне нужно начать комбинировать несколько столбцов данных для выполнения одних и тех же типов вычислений.

Мне нужно собрать подробную информацию о трех полях следующим образом:

survey_job.survey_responses.collect(&:base_pay)
survey_job.survey_responses.collect(&:bonus_pay)
survey_job.survey_responses.collect(&:overtime_pay)

Это даст мне 3 массива. Затем мне нужно объединить их в один массив, сложив каждое из соответствующих значений вместе - то есть добавить первый результат из каждого массива, второй результат из каждого массива и т. Д., Чтобы у меня был массив итогов.

Как создать метод, который будет собирать все эти данные вместе, и как я вызываю его из шаблона представления?

Действительно ценю любую помощь в этом ...

Спасибо

Simon

Ответы [ 2 ]

2 голосов
/ 26 июня 2009
s = survey_job.survey_responses
pay = s.collect(&:base_pay).zip(s.collect(&:bonus_pay), s.collect(&:overtime_pay))
pay.map{|i| i.compact.inject(&:+) }

Сделайте это, но со значимыми именами переменных, и я думаю, что это сработает.

Определите обычный метод в app / helpers / _helper.rb, и он будет работать в представлении

Редактировать: теперь это работает, если они содержат ноль или имеют разные размеры (при условии, что самый длинный массив - тот, на котором вызывается zip.

0 голосов
/ 26 июня 2009

Вот метод, который объединит произвольное количество массивов, взяв сумму по каждому индексу. Это также позволит каждому массиву иметь разную длину.

def combine(*arrays)
  # Get the length of the largest array, that'll be the number of iterations needed
  maxlen = arrays.map(&:length).max
  out = []

  maxlen.times do |i|
    # Push the sum of all array elements at a given index to the result array
    out.push( arrays.map{|a| a[i]}.inject(0) { |memo, value| memo += value.to_i } )
  end

  out
end

Тогда в контроллере вы можете сделать

base_pay = survey_job.survey_responses.collect(&:base_pay)
bonus_pay = survey_job.survey_responses.collect(&:bonus_pay)
overtime_pay = survey_job.survey_responses.collect(&:overtime_pay)

@total_pay = combine(base_pay, bonus_pay, overtime_pay)

А затем, по вашему мнению, обращайтесь к @total_pay.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...