1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# in extension lib/ranged_hash.rb
class RangedHash
  def initialize(hash)
    @ranges = hash
  end

  def [](key)
    @ranges.each do |range, value|
      return value if range.include?(key)
    end
    nil
  end
end

# in config/environment.rb
SHIPPING_RATES = RangedHash.new(
  (0.00..14.99) => {'std' => 9.95, 'pry' => 15.90, 'sat' => 19.95},
  (15.00..33.99) => {'std' => 12.95, 'pry' => 18.90, 'sat' => 22.95},
  (34.00..38.99) => {'std' => 13.95, 'pry' => 19.90, 'sat' => 23.95},
  (39.00..45.99) => {'std' => 14.95, 'pry' => 20.90, 'sat' => 24.95},
  (46.00..55.99) => {'std' => 15.95, 'pry' => 21.90, 'sat' => 25.95},
  (56.00..58.99) => {'std' => 16.95, 'pry' => 22.90, 'sat' => 26.95},
  (59.00..68.99) => {'std' => 18.95, 'pry' => 24.90, 'sat' => 28.95},
  (69.00..84.99) => {'std' => 20.95, 'pry' => 26.90, 'sat' => 30.95},
  (85.00..10000) => {'std' => 37.95, 'pry' => 43.90, 'sat' => 47.95}
)

#Use like this
ship_method = 'std'
price = 12.15
shipping_rate = SHIPPING_RATE[price][ship_method] # returns 9.95

ship_method = 'pry'
price = 47.32
shipping_rate = SHIPPING_RATE[price][ship_method] # returns 21.90