配列を覚えると大変便利なことに気付いた。
1つの注文に対して複数の注文商品が登録されており、1つの注文の合計金額をorders/show画面に出したい。
使用するメソッドは今回.injectを使う。
関係は以下とする。
app/assets/models/order.rb
class Order < ApplicationRecord
has_many :order_products, dependent: :destroy
end
app/assets/models/order_product.rb
class OrderProduct < ApplicationRecord
belongs_to :order
end
OrderProductモデルにあるのは以下のカラム
・product_name(商品名)
・quantity(数量)
・price(単価)
orders_controller.rb
def show
@order = Order.find(params[:id])
@total = [] #配列の初期化
@order.order_products.each do |order_product|
@total << order_product.quantity * order_product.price
end
#@orderの持つorder_productの数だけ@totalという配列に各レコードの小計を<<でつっこんでいく
end
orders/show.html.erb
@total.inject{|sum, n| sum + n }
これだけ。最初配列をよく知らなくてめちゃくちゃ悩んだ。
送料でもつけたければ @total.inject{|sum, n| sum + n } + 送料 でもいい。
ただしそれをすると注文商品レコードが1つしか該当しない場合は反映されないので条件分岐が必要。
orders/show.html.erb
<% if @total.count = 1 %>
<%= @total + 送料 %>
<% else %>
<%= @total.inject{|sum, n| sum + n } + 送料 %>
<% end %>
こんな感じ。
これが例えば注文一覧に埋め込みたい場合は.findで定義付けできないのでhtmlにそのまま書き込む。