рельсы способ расчета промежуточных итогов и итогов - PullRequest
4 голосов
/ 16 октября 2011

Контекст: у меня 2 модели Order and Item.

Я хочу рассчитать промежуточную сумму товара на основе item.quantity * item.price Пока это делается в виде (но не в соответствующем месте).

<%= number_to_currency(item.quantity * item.price) %>

Мне также нужно рассчитать сумму заказа, но я застрял. У меня нет колонки для этого. Какой лучший подход? Использовать модель? Помощник или Наблюдатель?

Пока мне удалось заставить промежуточный итог работать через помощника по заказам

def item_subtotal(item)
  item_subtotal = item.quantity * item.price
end

Рабочий раствор:

Модель товара

def subtotal
  price * quantity
end

В представлении визуализации <%= item.subtotal %>

Заказ модели

def total_price
  total_price = items.inject(0) { |sum, p| sum + p.subtotal }
end

Order # show view render <%= number_to_currency(@order.total_price) %>

Ответы [ 3 ]

7 голосов
/ 16 октября 2011

В вашей модели Предмета вы можете добавить метод промежуточных итогов:

def subtotal
  quantity * price
end

Предполагая, что вы модель Заказа как отношение has_many с Предметом, вы можете map коллекцию, чтобы получить список цен намодель заказа:

def subtotals
  items.map do |i| i.subtotal end
end

Поскольку вы работаете в среде Rails, вы можете использовать метод activesupport sum, чтобы получить итоговую сумму по модели заказа:

def total
  subtotals.sum
end

илиесли вы предпочитаете собрать все это вместе:

def total
  items.map do |i| i.subtotal end.sum
end

Тогда вы можете использовать промежуточные итоги по Item и total по Order в ваших представлениях.

Редактировать: представление может выглядеть следующим образом:

<% for item in @order.items %> <%= item.price %><br/><% end %>
<%= @order.total %>
0 голосов
/ 24 июля 2015

Вы можете показать item_subtotal, используя

, а для общей суммы вы можете вычислить его как

total_price = @ order.items.to_a.sum {| item |total = item.product.price * item.quantity}

Я думаю, это сработает для вас.

0 голосов
/ 16 октября 2011

Поскольку это функциональная возможность модели (вы хотите рассчитать что-то для элемента, который является самоссылочным), то более подходящим местом является сама модель, так что вы можете легко использовать

item.subtotal
...