У меня есть таблица с полями цены и количества. Я хочу добавить количество цены * в общую сумму за каждый элемент, который я в конечном итоге добавлю в таблицу.
Мой код выглядит так.
<table>
<thead>
<tr>
<th width="200">Name</th>
<th width="150">Price</th>
<th>Quantity</th>
<th width="150">Total</th>
</tr>
<% @item.each do |item| %>
<tr>
<td><%= item.name %></td>
<td><%= item.price %></td>
<td><%= item.quantity %></td>
<td><%= item.quantity * item.price %></td>
<td class="actions">
<% link_to("update", :class => 'action update') %>
<% link_to("X", :class => 'action delete') %>
</td>
</tr>
<% end %>
</thead>
</table>
и моя общая сумма в виде ярлыка. Как мне это сделать? Существует ли статическая переменная в RoR?
Вы должны добавить поле grand_total в таблицу и создать обратный вызов в модели Item. Этот обратный вызов будет сохранять значение общей суммы в таблице каждый раз при создании нового элемента.
before_save : save_grand_total
def save_grand_total
self.grand_total = self.quantity * self.price
end
<table>
<thead>
<tr>
<th width="200">Name</th>
<th width="150">Price</th>
<th>Quantity</th>
<th width="150">Total</th>
</tr>
<% grand_total=0 %>
<% @item.each do |item| %>
<tr>
<td><%= item.name %></td>
<td><%= item.price %></td>
<td><%= item.quantity %></td>
<td><%= item.quantity * item.price %></td>
<% grand_total+= item.quantity * item.price %>
<td class="actions">
<% link_to("update", :class => 'action update') %>
<% link_to("X", :class => 'action delete') %>
</td>
</tr>
<% end %>
</thead>
</table>
Вы можете использовать Enumerable#inject
чтобы получить общую сумму следующим образом:
<% #= @item.inject{ |grand_total, quantity| grand_total + (quantity * cart.price) } %>
Обновить:
Пожалуйста, проигнорируйте приведенную выше строку кода, чтобы показать вам пример. Следующий пример кода должен решить вашу проблему.
Поместите следующую строку, в которой вы хотите отобразить общую сумму.
<%= label_tag 'grand_total',
@item.inject(0) { |grand_total, item| grand_total + (item.quantity * item.price) } %>
@item.inject(0){ |grand_total, item| grand_total + (item.quantity * item.price) }
@item.inject(0){ |grand_total, item| grand_total + (item.quantity * item.price) }
применяет блок к каждому item
. Первый параметр grand_total
в этом случае сначала присваивается начальному значению 0
. Это делается через inject(0)
.
Блок затем начинает накапливать (item.quantity * item.price)
в grand_total
, который является конечным значением, которое возвращается в inject
.
Надеюсь, это имеет смысл.