有幾點值得注意:
- 功能非常基本 , 有update的部分需要修改
- 購物車的基本概念是,使用者在購物時會新增一個session,這個session是一個hash,命名為@product,裡頭會以各個product的id作為key,以product的amount作為value。
- 當確定要結帳時,再將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解釋:
- initialize的部分,要先確定瀏覽器裡是否已經有session_cart了,如果有,則將session_cart 裡的每個key變成interger。但map完會變成一個array,所以用hash內建的method把array變回hash再塞回@product
- update部分 清空一個key value的部份需修改。否則的話,@product就會以product_id為key ,amount為value來修改這對key value。
- add概念類似第二點
- to_h為cart這個類別新稱一個method,使一個cart類別下的物件可以用.to_h得到@product這個hash變數
- count目的為了算出有幾件商品,.count為hash變數的方法,算出有幾個key value pair
- total目的是為了算出總共多少錢,reduce(0)代表total從0開始。傳入@product裡的product_id 及 amount。設一個product變數去連接到資料庫去確定有沒有id 為 product_id的這件商品,有的話total就加上amount*product.price,沒有的話就維持
沒有留言:
張貼留言