Created
July 27, 2012 09:15
-
-
Save mimosz/3187023 to your computer and use it in GitHub Desktop.
ruby:按过滤器统计库存
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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