fork download
  1. require 'date'
  2. require 'ostruct'
  3.  
  4. class OrdersReport
  5. def initialize(orders, start_date, end_date)
  6. @orders = orders
  7. @start_date = start_date
  8. @end_date = end_date
  9. end
  10.  
  11. def total_sales_within_date_range
  12. within_date_range = ->order{ order.placed_at.between?(@start_date, @end_date) }
  13. @orders.select(&within_date_range).sum(&:amount)
  14. end
  15.  
  16. end
  17.  
  18. class Array #for ideone.com
  19. def sum(zero = 0, &b)
  20. inject(zero){ | s, e | s + (b ? b[e] : e) }
  21. end
  22. end
  23.  
  24. class Order < OpenStruct
  25. end
  26.  
  27. order_within_range1 = Order.new(amount: 5,placed_at: Date.new(2016, 10, 10))
  28. order_within_range2 = Order.new(amount: 10,placed_at: Date.new(2016, 10, 15))
  29. order_out_of_range = Order.new(amount: 6,placed_at: Date.new(2016, 1, 1))
  30. orders = [order_within_range1, order_within_range2, order_out_of_range]
  31.  
  32. start_date = Date.new(2016, 10, 1)
  33. end_date = Date.new(2016, 10, 31)
  34.  
  35. report = OrdersReport.new(orders, start_date, end_date)
  36. p report.total_sales_within_date_range #=> 15
Success #stdin #stdout 0.06s 10088KB
stdin
Standard input is empty
stdout
15