2011-11-22 43 views
1

我卡住合并一些哈希来得到我需要的结果。如何有条件地合并散列并添加值?

散列包含订单总价格的细目,项目价格,税收,&送货,订购中的所有订单。我试图动态执行此操作,因为并非所有订单都收取税费,甚至不需要税或运费。

这里就是我称之为“最坏的情况”我正在处理:

#First order - has charges for Canadian GST and HST 
{:orderhdr_id=>17654122, :order_item_seq=>1, :order_item_amt_break_seq=>1, :order_item_break_type=>0, :local_amount=>8.16, :base_amount=>8.16, :orig_base_amount=>149, :tax_delivery=>0, :tax_active=>0} 
{:orderhdr_id=>17654122, :order_item_seq=>1, :order_item_amt_break_seq=>2, :order_item_break_type=>1, :local_amount=>0.41, :base_amount=>0.41, :state=>"ON", :tax_type=>"GST", :tax_rate_category=>"STD", :orig_base_amount=>7.45, :tax_rate=>5, :tax_delivery=>0, :tax_active=>1, :tx_incl=>1} 
{:orderhdr_id=>17654122, :order_item_seq=>1, :order_item_amt_break_seq=>3, :order_item_break_type=>1, :local_amount=>0.65, :base_amount=>0.65, :state=>"ON", :tax_type=>"HST", :tax_rate_category=>"STD", :orig_base_amount=>11.92, :tax_rate=>8, :tax_delivery=>0, :tax_active=>1, :tx_incl=>1} 
#Second order - has only one charge for tax 
{:orderhdr_id=>1815296, :order_item_seq=>1, :order_item_amt_break_seq=>1, :order_item_break_type=>0, :local_amount=>76.52, :base_amount=>76.52, :orig_base_amount=>99.95, :tax_delivery=>0, :tax_active=>0} 
{:orderhdr_id=>1815296, :order_item_seq=>1, :order_item_amt_break_seq=>2, :order_item_break_type=>1, :local_amount=>4.59, :base_amount=>4.59, :orig_base_amount=>6, :tax_delivery=>0, :tax_active=>1} 
#Third order - has charge for shipping 
{:orderhdr_id=>6112412, :order_item_seq=>1, :order_item_amt_break_seq=>1, :order_item_break_type=>0, :local_amount=>21.34, :base_amount=>21.34, :orig_base_amount=>99.95, :tax_delivery=>0, :tax_active=>0} 
{:orderhdr_id=>6112412, :order_item_seq=>1, :order_item_amt_break_seq=>2, :order_item_break_type=>2, :local_amount=>4.7, :base_amount=>4.7, :orig_base_amount=>22, :tax_delivery=>0, :tax_active=>0} 

:order_item_break_type决定了它是什么类型的收费,项目,税收,航运。

如果:order_item_break_type为0或2,然后从:orig_base_amount减去:base_amount并将其添加到该中断类型的整体总。对于:order_item_break_type等于1,我需要总结:orig_base_amount:base_amount,的差异,但是我需要将不同的税分开。

因此,这里是我应该与上面的命令结束了一下:

:break_type = 0 | total = 242.88 
:break_type = 1, :state = ON, :tax_type = GST, :tax_rate_category = STD | total = 7.04 
:break_type = 1, :state = ON, :tax_type = HST, :tax_rate_category = STD | total = 11.27 
:break_type = 1 | total = 1.41 
:break_type = 2 | total = 17.30 

我有叫@amounts数组这些哈希值。

我有像merge!,inject,shift和更多的方法,通过我的头,但不能把它放在一起。

+0

目前尚不清楚结果如何与订单相关。也就是说,我看到三个订单和五个结果。你能澄清一下吗? –

+0

结果是由':break_type',':state',':tax_type'和':tax_rate_category'的唯一组合组合的每次收费的':orig_base_amount - :base_amount'的总和。我倾向于看它的方式是,相对于有3个订单和5个结果,有7个费用减少到5个结果。谢谢! –

回答

1

这个怎么样?不过,我真的不知道你在那里做什么。

@amounts = [ 
#First order - has charges for Canadian GST and HST 
{:orderhdr_id=>17654122, :order_item_seq=>1, :order_item_amt_break_seq=>1, :order_item_break_type=>0, :local_amount=>8.16, :base_amount=>8.16, :orig_base_amount=>149, :tax_delivery=>0, :tax_active=>0}, 
{:orderhdr_id=>17654122, :order_item_seq=>1, :order_item_amt_break_seq=>2, :order_item_break_type=>1, :local_amount=>0.41, :base_amount=>0.41, :state=>"ON", :tax_type=>"GST", :tax_rate_category=>"STD", :orig_base_amount=>7.45, :tax_rate=>5, :tax_delivery=>0, :tax_active=>1, :tx_incl=>1}, 
{:orderhdr_id=>17654122, :order_item_seq=>1, :order_item_amt_break_seq=>3, :order_item_break_type=>1, :local_amount=>0.65, :base_amount=>0.65, :state=>"ON", :tax_type=>"HST", :tax_rate_category=>"STD", :orig_base_amount=>11.92, :tax_rate=>8, :tax_delivery=>0, :tax_active=>1, :tx_incl=>1}, 
#Second order - has only one charge for tax 
{:orderhdr_id=>1815296, :order_item_seq=>1, :order_item_amt_break_seq=>1, :order_item_break_type=>0, :local_amount=>76.52, :base_amount=>76.52, :orig_base_amount=>99.95, :tax_delivery=>0, :tax_active=>0}, 
{:orderhdr_id=>1815296, :order_item_seq=>1, :order_item_amt_break_seq=>2, :order_item_break_type=>1, :local_amount=>4.59, :base_amount=>4.59, :orig_base_amount=>6, :tax_delivery=>0, :tax_active=>1}, 
#Third order - has charge for shipping 
{:orderhdr_id=>6112412, :order_item_seq=>1, :order_item_amt_break_seq=>1, :order_item_break_type=>0, :local_amount=>21.34, :base_amount=>21.34, :orig_base_amount=>99.95, :tax_delivery=>0, :tax_active=>0}, 
{:orderhdr_id=>6112412, :order_item_seq=>1, :order_item_amt_break_seq=>2, :order_item_break_type=>2, :local_amount=>4.7, :base_amount=>4.7, :orig_base_amount=>22, :tax_delivery=>0, :tax_active=>0}, 
] 

@totals = Hash.new(0) 

@amounts.group_by{|row| row[:order_item_break_type]}.each do |break_type, rows| 

    rows.each do |row| 

    key = [break_type, row[:tax_type]] 
    @totals[key] += row[:orig_base_amount] - row[:base_amount] 

    end 
end 

@totals 
# => {[0, nil]=>242.88, 
#  [1, "GST"]=>7.04, 
#  [1, "HST"]=>11.27, 
#  [1, nil]=>1.4100000000000001, 
#  [2, nil]=>17.3} 
+0

我认为这可能有效。我必须通过几种不同的场景,但乍看起来它看起来不错。 –

+0

实际上,根本不需要外循环('group_by')。只需使用'inject'或'each_with_object'而不是'each'即可。 –

+0

对不起,我花了很长时间回到这个......疯狂的时间表。无论如何,我尝试了它,它确实如我所愿,所以,谢谢! –