Рубин: на общую сумму - PullRequest
       1

Рубин: на общую сумму

0 голосов
/ 26 марта 2012

У меня есть модель Donation.rb со столбцом amount, который принимает целое число.Я хочу суммировать все отдельные пожертвования вместе и показать общую сумму на главной странице.

В home_controller я делаю @donations = Donation.all, а затем в представлении, которое я делаю

<% sum = 0 %>
<% @donations.each do |donation| %> 
<%= sum += donation.amount if donation.amount? %>
<% end %>

Проблема в том, что при каждом добавлении нового пожертвования печатается текущая суммак этому.Я просто хочу итоговую сумму после того, как все они были добавлены вместе.

Ответы [ 4 ]

4 голосов
/ 26 марта 2012

Вы не должны делать какие-либо вычисления в представлении, это должно быть сделано в контроллере или модели, если это возможно. Для чего-то подобного я бы сделал в контроллере

@donations = Donation.paginate(:page => params[:page], :order => 'created_at desc', :per_page => 20)
@sum = Donation.sum(&:amount)

Затем просто распечатайте @sum в представлении

<%= @sum %>
1 голос
/ 26 марта 2012

Это потому, что любой экземпляр <%= ... %> будет встраивать результат. Обычная <% ... %> версия не будет.

Не делайте такого рода вычисления в представлении. Сделайте метод класса на Пожертвование, который будет обрабатывать его для вас. Если вам нужно более одной строки для выражения вычисления в представлении, создайте вспомогательный метод или, что лучше, метод модели.

1 голос
/ 26 марта 2012

Это должно напечатать сумму, как только она будет рассчитана.

<% sum = 0 %>
<% @donations.each do |donation| %> 
  <% sum += donation.amount if donation.amount? %>
<% end %>
<%= sum %>
1 голос
/ 26 марта 2012

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

<%= sum += donation.amount if donation.amount? %>

С:

<% sum += donation.amount if donation.amount? %>

А затем просто напечатайте значение sum, где вы хотите сделать:

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