class HasMeta::MetaData
Attributes
data_type[R]
value[RW]
Public Class Methods
generate_value_hash(*values)
click to toggle source
# File lib/has_meta/meta_data.rb, line 23 def self.generate_value_hash *values # values = 'some text' # values = ['some text', 'some other text'] # values = ['some text', 'some other text', 9] if values.size == 1 # {text_value: 'some text'} value_hash_for values.pop else # ['some text', 'some other text', 9] # [{text_value: 'some text'}, {text_value: 'some other text'}, {integer_value: 9}] # {:text_value=>[{:text_value=>"some text"}, {:text_value=>"some other text"}], :integer_value=>[{:integer_value=>9}]} # values.map { |value| value_hash_for value }.group_by { |x| x.keys.first }.map {|k, v| {k => v.map {|x| x.values.first}}} values .map { |value| value_hash_for value } .group_by { |x| x.keys.first } .reduce({}) do |acc, hash| key, value = *hash acc.merge({key => value.size == 1 ? value.first.values.first : value.map {|x| x.values.first}}) end # .map {|k, v| {k => v.map {|x| x.values.first}}} end end
Private Class Methods
date_try_convert(value)
click to toggle source
# File lib/has_meta/meta_data.rb, line 104 def self.date_try_convert value begin value.to_date if value =~ /^\d{4}-\d{2}-\d{2}$/ rescue nil end end
datetime_try_convert(value)
click to toggle source
# File lib/has_meta/meta_data.rb, line 112 def self.datetime_try_convert value begin value.to_datetime if value =~ /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} (\+|-)\d{4}$/ rescue nil end end
has_datetime_column?()
click to toggle source
# File lib/has_meta/meta_data.rb, line 141 def self.has_datetime_column? self.column_names.include? 'datetime_value' end
max_integer_value()
click to toggle source
# File lib/has_meta/meta_data.rb, line 98 def self.max_integer_value column_limit = HasMeta::MetaData.column_for_attribute(:integer_value).limit column_limit = 4 if column_limit.in? [nil, 11] (256**column_limit)/2 - 1 end
resolve_data_type!(value)
click to toggle source
# File lib/has_meta/meta_data.rb, line 69 def self.resolve_data_type! value case value when ->(x) {x.kind_of? Integer} if value < max_integer_value return :integer, value else return :text, value.to_s end when ->(x) {x.kind_of? Float} return :decimal, value when ->(x) {x.kind_of? Date} return :date, value when ->(x) {x.acts_like? :time} if has_datetime_column? return :datetime, value else return :text, value end when ->(x) {x.respond_to? :id} return :integer, value.id else return :integer, value.to_i if value =~ /^-?\d+$/ return :decimal, value.to_f if value =~ /^-?\d*\.\d+$/ return :date, value.to_date if date_try_convert value return :datetime, value.to_datetime if has_datetime_column? and datetime_try_convert(value) return :text, value end end
value_hash_for(value)
click to toggle source
# File lib/has_meta/meta_data.rb, line 64 def self.value_hash_for value data_type, value = resolve_data_type! value {"#{data_type}_value": value} end
Public Instance Methods
value=(value, options={})
click to toggle source
# File lib/has_meta/meta_data.rb, line 13 def value= value, options={} if options[:as] @data_type = options[:as] @value = value else @data_type, @value = resolve_data_type! value end set_attribute end
Private Instance Methods
convert_type(value)
click to toggle source
# File lib/has_meta/meta_data.rb, line 48 def convert_type value begin if value =~ /^-?\d+/ and value.to_i > 2000000000 value.to_i elsif value =~ /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} (\+|-)\d{4}$/ value.to_time elsif value =~ /^\d{4}-\d{2}-\d{2}$/ value.to_date else value end rescue value end end
reset_values()
click to toggle source
# File lib/has_meta/meta_data.rb, line 130 def reset_values value_attributes.keys.each do |attribute| self[attribute] = nil end end
resolve_data_type!(value)
click to toggle source
# File lib/has_meta/meta_data.rb, line 120 def resolve_data_type! value self.class.resolve_data_type! value end
set_attribute()
click to toggle source
# File lib/has_meta/meta_data.rb, line 136 def set_attribute reset_values self[:"#{@data_type}_value"] = @value end
value_attributes()
click to toggle source
# File lib/has_meta/meta_data.rb, line 124 def value_attributes self.attributes.select do |k, _| k =~ /_value/ end end