class Lol::DynamicModel

DynamicModel extends OpenStruct adding the following features:

Attributes

raw[R]

Public Class Methods

new(hash={}) click to toggle source
# File lib/lol/dynamic_model.rb, line 11
def initialize(hash={})
  raise ArgumentError, 'An hash is required as parameter' unless hash.is_a? Hash
  @raw = hash
  @table = {}
  @hash_table = {}

  hash.each do |k,v|
    key = k.to_s.underscore
    set_property key, v
    new_ostruct_member(key)
  end
end

Public Instance Methods

as_json(opts={}) click to toggle source
# File lib/lol/dynamic_model.rb, line 28
def as_json opts={}
  @table.as_json
end
to_h() click to toggle source
# File lib/lol/dynamic_model.rb, line 24
def to_h
  @hash_table
end

Protected Instance Methods

class_for_property(property) click to toggle source
# File lib/lol/dynamic_model.rb, line 34
def class_for_property property
  self.class
end

Private Instance Methods

convert_object(obj, property: if obj.is_a? Hash) click to toggle source
# File lib/lol/dynamic_model.rb, line 57
def convert_object obj, property:
  if obj.is_a? Hash
    class_for_property(property).new obj
  elsif obj.respond_to?(:map)
    obj.map { |o| convert_object o, property: property }
  else
    obj
  end
date_key?(key) click to toggle source
# File lib/lol/dynamic_model.rb, line 40
def date_key? key
  key.match(/^(.+_)?(at|date)$/)
end
set_property(key, v) click to toggle source
# File lib/lol/dynamic_model.rb, line 44
def set_property key, v
  if date_key?(key) && v.is_a?(Integer)
    @table[key.to_sym] = @hash_table[key.to_sym] = value_to_date v
  else
    @table[key.to_sym] = convert_object v, property: key.to_sym
    @hash_table[key.to_sym] = v
  end
end
value_to_date(v) click to toggle source
# File lib/lol/dynamic_model.rb, line 53
def value_to_date v
  Time.at(v / 1000)
end