有幾點值得注意:
- 功能非常基本 , 有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,沒有的話就維持
沒有留言:
張貼留言