4

コンテキスト: Order と Item の 2 つのモデルがあります。

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 ビュー レンダー<%= number_to_currency(@order.total_price) %>

4

3 に答える 3

7

Item モデルでは、subtotal メソッドを追加できます。

def subtotal
  quantity * price
end

Order モデルを Item との has_many 関係として使用すると仮定するとmap、コレクションは Order モデルの価格のリストを取得できます。

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

Rails 環境で実行しているため、activesupportsumメソッドを使用して Order モデルの合計を取得できます。

def total
  subtotals.sum
end

または、すべてをまとめたい場合は、次のようにします。

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

次に、アイテムの小計と注文の合計をビューで使用できます。

編集:ビューは次のようになります。

<% for item in @order.items %> <%= item.price %><br/><% end %>
<%= @order.total %>
于 2011-10-16T03:53:56.637 に答える
0

を使用して item_subtotal を表示できます

総計については、次のように計算できます

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

これでうまくいくと思います。

于 2015-07-24T07:04:36.417 に答える
0

それはモデルの機能であるため (アイテムの自己参照的な何かを計算したい)、より適切な場所はモデル自体であり、簡単に使用できるようになります。

item.subtotal
于 2011-10-16T02:53:51.427 に答える