Class: Auctify::MinimalBidsLadderType

Inherits:
ActiveRecord::Type::Value
  • Object
show all
Defined in:
app/types/auctify/minimal_bids_ladder_type.rb

Overview

in ruby/rails we expecting default format as hash with ranges { (0…1_000) => 200, (1_000..) => 500 } but acceppting (in setter) also hash with numbers or strings in DB we store JSON with minimal prices casted to nice strings : { “0” => 200, “1_000” => 500 }

Instance Method Summary collapse

Instance Method Details

#cast(value) ⇒ Object

setter



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'app/types/auctify/minimal_bids_ladder_type.rb', line 12

def cast(value) # setter
  # hash is expected as value
  value = JSON.parse(value) if value.is_a?(String)
  if value.blank?
    {}
  else
    case value.keys.first
    when Range  # { (0...1_000) => 200, (1_000..) => 500 }
      cast_from_ranges(value)
    when String # { "0" => 200, "1_000" => 500 }
      cast_from_min_strings(value)
    when Numeric # { 0 => 200, 1000 => 500 }
      cast_from_min_numbers(value)
    else
      raise "Uncovered ladder key type `#{value.keys.first}`"
    end
  end
end

#deserialize(db_value) ⇒ Object

getter, from db data to ruby raw object



31
32
33
34
35
# File 'app/types/auctify/minimal_bids_ladder_type.rb', line 31

def deserialize(db_value) # getter, from db data to ruby raw object
  return {} if db_value.blank?

  cast(ActiveSupport::JSON.decode(db_value))
end

#serialize(value) ⇒ Object

modifier to store in db



37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'app/types/auctify/minimal_bids_ladder_type.rb', line 37

def serialize(value) # modifier to store in db
  return nil if value.nil? # so You are able to do `KLASS.where(bid_steps_ladder: nil)`

  # value should be Hash with ranges as keys
  result = {}

  value.each_pair do |k_range, v|
    min_price_string = ActiveSupport::NumberHelper.number_to_delimited(k_range.first, delimiter: "_")
    result[min_price_string] = v
  end

  ActiveSupport::JSON.encode(result)
end

#typeObject



8
9
10
# File 'app/types/auctify/minimal_bids_ladder_type.rb', line 8

def type
  :jsonb
end