貼code

2017年2月6日 星期一

Rails 購物車 cart的model部份

Rails 購物車cart 的部分。
有幾點值得注意:
  1. 功能非常基本 , 有update的部分需要修改
  2. 購物車的基本概念是,使用者在購物時會新增一個session,這個session是一個hash,命名為@product,裡頭會以各個product的id作為key,以product的amount作為value。
  3. 當確定要結帳時,再將cart送到訂單,訂單部分再接Active Record再連到資料庫。如此一來可以避免產生許多未完成的購物資料(沒真正要買)。 
code 部分:
class Cart
  def initialize(session_cart)
    if session_cart
      @products = session_cart.map{|key, val| [key.to_i, val]}.to_h
    else
      @products = Hash.new
    end
  end

  def update(product_id, amount)
    if amount == 0
      @products[product_id] = nil
    else
      @products[product_id] = amount
    end
  end

  def add(product_id, amount = 1)
    if @products[product_id]
      @products[product_id] += amount
    else
      @products[product_id] = amount
    end
  end

  def to_h
    @products
  end

  def count
    @products.count
  end

  def each
    return enum_for(:each) unless block_given?

    @products.each do |product_id, amount|
      product = Product.find_by_id(product_id)
      if product
        yield product, amount
      end
    end
  end

  def total
    @products.reduce(0) do |total, (product_id, amount)|
      product = Product.find_by_id(product_id)
      if product
        total + product.price * amount
      else
        total
      end
    end
  end
end

解釋:

  1. initialize的部分,要先確定瀏覽器裡是否已經有session_cart了,如果有,則將session_cart 裡的每個key變成interger。但map完會變成一個array,所以用hash內建的method把array變回hash再塞回@product
  2. update部分 清空一個key value的部份需修改。否則的話,@product就會以product_id為key ,amount為value來修改這對key value。
  3. add概念類似第二點
  4.  to_h為cart這個類別新稱一個method,使一個cart類別下的物件可以用.to_h得到@product這個hash變數
  5.  count目的為了算出有幾件商品,.count為hash變數的方法,算出有幾個key value pair
  6. total目的是為了算出總共多少錢,reduce(0)代表total從0開始。傳入@product裡的product_id 及 amount。設一個product變數去連接到資料庫去確定有沒有id 為 product_id的這件商品,有的話total就加上amount*product.price,沒有的話就維持

沒有留言:

張貼留言