Skip to content

Instantly share code, notes, and snippets.

@mimosz
Created July 27, 2012 09:15
Show Gist options
  • Save mimosz/3187023 to your computer and use it in GitHub Desktop.
Save mimosz/3187023 to your computer and use it in GitHub Desktop.
ruby:按过滤器统计库存
def filter_meta(filter)
{ name: filter.name, num: 0, children: {}, item_ids: filter.item_ids}
end
def filter_tree(filter, node, filters) # 构建层级
key = filter._id.to_s
unless node.has_key?(key)
node[key] = filter_meta(filter)
if filter.child_ids.count > 0
children = node[key][:children] = {}
filters.also_in(_id: filter.child_ids).each do |child|
filter_tree(child, children, filters)
end
end
end
end
def filter_by_ids(node, item) # 商家编码过滤
if node[:item_ids].include?(item.num_iid)
process_filtered(node, item)
end
end
def process_filtered(node, item)
quantity_sum(node, item)
if node.has_key?(:children)
filter_by(node[:children], item)
end
end
def filter_by(node, item) # 过滤列表
node.each do |key, val|
filter_by_ids(val, item)
end
end
def quantity_sum(node, item) # 累加库存
if item.skus.empty?
node[:num] += item.num
else
item.skus.each do |sku|
node[:num] += sku.quantity
end
end
end
def parse_tree(filters, divide='') # 展开层级
filters.each do |key, filter|
puts divide + "#{filter[:name]} 的库存:#{filter[:num]}"
unless filter[:children].empty?
parse_filter_tree(filter[:children], ' ')
end
end
end
user=User.all[5]
parents = user.filter_lists.where(parent_ids: []).excludes(item_ids: []) # 不支持,按价格、折扣区间过滤
child = user.filter_lists.excludes(parent_ids: [], item_ids: []) # 非顶级
items = user.items.where(approve_status: 'onsale') # 在售
result = {} # 结果集
parents.each do |parent|
filter_tree(parent, result, child)
end
items.each do |item|
filter_by(result, item)
end
parse_tree(result)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment