Class: Cartman::Cart
- Inherits:
-
Object
- Object
- Cartman::Cart
- Defined in:
- lib/cartman/cart.rb
Constant Summary collapse
- CART_LINE_ITEM_ID_KEY =
"cartman:line_item:id"
Instance Method Summary collapse
- #add_item(options) ⇒ Object
- #cache_key ⇒ Object
- #contains?(object) ⇒ Boolean
- #count ⇒ Object
- #destroy! ⇒ Object
- #find(object) ⇒ Object
-
#initialize(uid) ⇒ Cart
constructor
A new instance of Cart.
- #items(type = nil) ⇒ Object
- #quantity ⇒ Object
- #reassign(new_id) ⇒ Object
- #remove_item(item) ⇒ Object
- #total ⇒ Object
- #touch ⇒ Object
- #ttl ⇒ Object
- #version ⇒ Object
Constructor Details
#initialize(uid) ⇒ Cart
Returns a new instance of Cart.
5 6 7 |
# File 'lib/cartman/cart.rb', line 5 def initialize(uid) @uid = uid end |
Instance Method Details
#add_item(options) ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 20 21 |
# File 'lib/cartman/cart.rb', line 9 def add_item() raise "Must specify both :id and :type" unless .has_key?(:id) && .has_key?(:type) line_item_id = redis.incr CART_LINE_ITEM_ID_KEY redis.pipelined do redis.mapped_hmset("cartman:line_item:#{line_item_id}", ) redis.hincrby("cartman:line_item:#{line_item_id}", :_version, 1) redis.sadd key, line_item_id redis.sadd index_key, "#{options[:type]}:#{options[:id]}" redis.set index_key_for(), line_item_id end touch get_item(line_item_id) end |
#cache_key ⇒ Object
117 118 119 |
# File 'lib/cartman/cart.rb', line 117 def cache_key "cart/#{@uid}-#{version}" end |
#contains?(object) ⇒ Boolean
40 41 42 |
# File 'lib/cartman/cart.rb', line 40 def contains?(object) redis.sismember index_key, "#{object.class}:#{object.id}" end |
#count ⇒ Object
50 51 52 |
# File 'lib/cartman/cart.rb', line 50 def count redis.scard key end |
#destroy! ⇒ Object
70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/cartman/cart.rb', line 70 def destroy! keys = line_item_keys keys << key keys << index_key keys << index_keys keys.flatten! redis.pipelined do keys.each do |key| redis.del key end end end |
#find(object) ⇒ Object
44 45 46 47 48 |
# File 'lib/cartman/cart.rb', line 44 def find(object) if contains?(object) get_item(redis.get(index_key_for(object)).to_i) end end |
#items(type = nil) ⇒ Object
31 32 33 34 35 36 37 38 |
# File 'lib/cartman/cart.rb', line 31 def items(type=nil) if type items = line_item_ids.collect{ |item_id| get_item(item_id)}.select{ |item| item.type == type } return ItemCollection.new(items) else return ItemCollection.new(line_item_ids.collect{ |item_id| get_item(item_id)}) end end |
#quantity ⇒ Object
54 55 56 57 58 |
# File 'lib/cartman/cart.rb', line 54 def quantity line_item_keys.collect { |item_key| redis.hget item_key, Cartman.config.quantity_field }.inject(0){|sum,quantity| sum += quantity.to_i} end |
#reassign(new_id) ⇒ Object
103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/cartman/cart.rb', line 103 def reassign(new_id) if redis.exists key new_index_keys = items.collect { |item| index_key_for(item, new_id) } redis.rename key, key(new_id) redis.rename index_key, index_key(new_id) index_keys.zip(new_index_keys).each do |key, value| redis.rename key, value end end @uid = new_id end |
#remove_item(item) ⇒ Object
23 24 25 26 27 28 29 |
# File 'lib/cartman/cart.rb', line 23 def remove_item(item) redis.del "cartman:line_item:#{item._id}" redis.srem key, item._id redis.srem index_key, "#{item.type}:#{item.id}" redis.del index_key_for(item) touch end |
#total ⇒ Object
60 61 62 63 64 |
# File 'lib/cartman/cart.rb', line 60 def total items.collect { |item| (item.cost * 100).to_i }.inject(0){|sum,cost| sum += cost} / 100.0 end |
#touch ⇒ Object
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/cartman/cart.rb', line 83 def touch keys_to_expire = line_item_keys keys_to_expire << key if redis.exists index_key keys_to_expire << index_key keys_to_expire << index_keys keys_to_expire.flatten! end redis.pipelined do keys_to_expire.each do |item| redis.expire item, Cartman.config.cart_expires_in end end redis.hincrby self.class.versions_key, version_key, 1 end |
#ttl ⇒ Object
66 67 68 |
# File 'lib/cartman/cart.rb', line 66 def ttl redis.ttl key end |
#version ⇒ Object
99 100 101 |
# File 'lib/cartman/cart.rb', line 99 def version redis.hget(self.class.versions_key, version_key).to_i end |