2016-11-02 5 views
1

Генерирование следующее сообщение об ошибке undefined method +' for #<DebitРельсы Метод сумма возвращает неопределенное значение

, где действие контроллер определяет

@debits = Debit.order("vatunitid ASC").where('unit_id = ? AND folio_id = ?', session[:unit_id], @folio.id).to_a 
@adhoc_folios = Folio.order("created_at asc").where(['checkout IS NULL AND unit_id = ? AND id != ?', session[:unit_id], @folio.id]).all 
@vatunits = Vatunit.where(['unit_id = ?', session[:unit_id]]).to_a 
@rates = @debits.map(&:vatunitid).uniq 

и в настоящее время в представлении (для целей тестирования)

@rates.each do |rate| 
    @debits_for_rate = @debits.select{ |i| i.vatunitid == rate } 
    @debits_for_rate.count 
    @debits_for_rate.sum(:amount) 

счетчик возвращается инструкции правильное значение
В этот момент не требуется вызов суммы.

Как это произошло и как его преодолеть?

ответ

5

Вы делаете это неэффективно, преобразовывая AR в массив и затем выполняете операции Ruby, в то время как вычисления уровня базы данных могут использоваться вместо этого.

Но для решения этой конкретной проблемы, вы должны пойти с:

@debits_for_rate.sum(&:amount) 
+0

Согласовано выше, неэффективно; дочерний процесс медленного выполнения операции «шаг за шагом». решаемая – Jerome

0

потому что ваш @debits_for_rate - это объект, а не массив чисел.

@debits_for_rate.sum(&:amount) еще

@debits_for_rate.map(&:amount).inject(:+)

Это за вами сумму.

+0

Пожалуйста, удалите свой ответ и редактировать @AndreyDeineko ответить с 'inject' кодом. Спасибо –

+0

@ABPrime нет необходимости редактировать мой ответ с 'inject', потому что всегда более эффективно делать певческий траверс над массивом, чем два (как здесь' map' и 'inject') :) –

+0

@AndreyDeineko: Согласен. –

Смежные вопросы