13
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

カート機能①カート内商品の合計金額を出す inject 税込価格の表示 / ECサイト

Last updated at Posted at 2021-07-20

はじめに

カート機能を作成中です。今回はカート内商品の合計金額を出すやり方を学習しました。

前提条件

ここで登場するテーブル・モデルは、 Customer Item Cart_item です。←(CustomerとItemの中間テーブルになる。) (Cartモデルを作成している記事が多いですが、Cartモデルは作成していません。)

*ログインしなくても商品の閲覧はできるが、カートには入れられない。

マイグレーションファイル

customer_id,item_idは外部キーで、個数はnull:falseにしています。

マイグレーションファイル
class CreateCartItems < ActiveRecord::Migration[5.2]
  def change
    create_table :cart_items do |t|
    

     t.integer :item_id
      t.integer :customer_id
      t.integer :quantity,null: false

      t.timestamps
    end
  end
end

モデルファイル

class CartItem < ApplicationRecord
    belongs_to :item
    belongs_to :customer
    
    validates :item_id, :quantity, presence: true
    validates :quantity, numericality:{ only_integer: true }
    
  def sum_of_price
    item.taxin_price * quantity
  end  
end

カート内しょうひんの合計金額を出すところで重要なのは、

    item.taxin_price * quantity
  end```です。
sum_of_priceで、ある商品の税込価格❌数量が出るようにしました。

taxin_priceというのは、item.rbで定義しています。

```perl:item.rb
def taxin_price
        price*1.1
    end

itemのテーブルには税抜価格であるpriceというカラムを作成しており、
taxin_priceというカラムはありませんが、ここで定義することにより、item.taxin_priceで税込価格が取り出せるようになりました。
以下の記事を参考にしました。

最難関 コントローラー

cart_items_controller.rb
def index
    @cart_items= current_customer.cart_items.all
    # カートに入ってる商品の合計金額
    @total = @cart_items.inject(0) { |sum, item| sum + item.sum_of_price }
  end

カート内商品の一覧画面で、カート内商品の合計金額を算出します。

モデルファイルの記述や、
@total = @cart_items.inject(0) { |sum, item| sum + item.sum_of_price }は、以下の記事を参考に記述し、実装しましたが、初心者にはコードの意味が理解できなかったので、、
読み解いていきたいと思います。

コードの解読

@total = @cart_items.inject(0) { |sum, item| sum + item.sum_of_price }

inject(0)って何??
配列の合計を算出するらしい。 ```配列オブジェクト.inject {|初期値, 要素| ブロック処理 }```が基本の形 inject(0)の(0)は、初期値は0ですよ〜ということのよう。
{ |sum, item| sum + item.sum_of_price }で行ってることは?
1回目の動作
@cart_itemsから、カートに入ってる1つ目のitem取り出して、 sumにitem.sum_of_priceを足す。(sumの初期値は inject(0)で0)
2回目以降の動作
次のitem取り出して、sumにitem.sum_of_priceを足す。

これで、最終的にカート内商品の合計金額が出る!!!

injectは”注入” sumにモデルで定義してるitem.sum_of_priceがどんどん注入されてくイメージ!

以下の記事で理解できました!

viewファイル

cart_item.html.erb
¥<%= @total.round.to_s(:delimited)%>

これで合計金額出せました!!

13
17
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?