class Dymos::Model
Attributes
last_execute_query[RW]
last_execute_query[RW]
metadata[RW]
Public Class Methods
_execute(builder)
click to toggle source
# File lib/dymos/model.rb, line 149 def self._execute(builder) query = builder.build response = ::Dymos::Client.new.command builder.command, query @last_execute_query = {command: builder.command, query: query} to_model(class_name, response) end
all()
click to toggle source
# File lib/dymos/model.rb, line 122 def self.all if @query.present? && (@query.keys & [:conditions, :add_condition, :where]).present? builder = ::Dymos::Query::Query.new.name(table_name) else builder = ::Dymos::Query::Scan.new.name(table_name) end @query.each do |k, v| builder.send k, *v end if @query.present? @query={} _execute(builder) end
class_name()
click to toggle source
@return [String]
# File lib/dymos/model.rb, line 177 def self.class_name self.name end
describe()
click to toggle source
# File lib/dymos/model.rb, line 164 def self.describe builder=::Dymos::Query::Describe.new.name(table_name) ::Dymos::Client.new.command :describe_table, builder.build end
field(attr, type, default: nil, desc: nil)
click to toggle source
# File lib/dymos/model.rb, line 45 def self.field(attr, type, default: nil, desc: nil) fail StandardError('attribute name is invalid') if attr =~ /[\!\?]$/ fail StandardError('require "default" option') if (type == :boolean && default.nil?) @fields ||= {} @fields[attr]={ type: type, default: default, desc:desc } define_attribute_methods attr define_model_callbacks attr define_method(attr) { |raw=false| run_callbacks attr do val = read_attribute(attr) || default return val if raw || !val.present? case type when :boolean to_b(val) when :time Time.parse val rescue nil when :integer val.to_i else val end end } define_singleton_method("#{attr}_type") { type } define_method("#{attr}_type") { type } define_singleton_method("#{attr}_desc") { desc } define_method("#{attr}_desc") { desc } define_method("#{attr}?") do val = self.send attr if type == :boolean val else !val.nil? end end define_model_callbacks :"set_#{attr}" define_method("#{attr}=") do |value, initialize=false| run_callbacks :"set_#{attr}" do value = value.iso8601 if self.class.fields.include?(attr) && value.is_a?(Time) write_attribute(attr, value, initialize) end end end
fields()
click to toggle source
# File lib/dymos/model.rb, line 97 def self.fields @fields end
find(key1, key2=nil)
click to toggle source
# File lib/dymos/model.rb, line 140 def self.find(key1, key2=nil) indexes = key_scheme keys={} keys[indexes.first[:attribute_name].to_sym] = key1 keys[indexes.last[:attribute_name].to_sym] = key2 if indexes.size > 1 builder = ::Dymos::Query::GetItem.new.name(table_name).key(keys) _execute(builder) end
key_scheme()
click to toggle source
# File lib/dymos/model.rb, line 156 def self.key_scheme @key_scheme ||= describe[:table][:key_schema] end
method_missing(name, *args, &block)
click to toggle source
Calls superclass method
# File lib/dymos/model.rb, line 23 def method_missing(name, *args, &block) if Dymos.model_query_methods.include? name @query||={} @query[name]=args self else super end end
new(params={})
click to toggle source
Calls superclass method
Dymos::Persistence::new
# File lib/dymos/model.rb, line 14 def initialize(params={}) @attributes={} send :attributes=, params, true super end
one()
click to toggle source
# File lib/dymos/model.rb, line 135 def self.one @query[:limit] = 1 self.all.first end
table(name)
click to toggle source
# File lib/dymos/model.rb, line 101 def self.table(name) define_singleton_method('table_name') { name } define_method('table_name') { name } end
Private Class Methods
extract(res, ignore_key)
click to toggle source
# File lib/dymos/model.rb, line 238 def self.extract(res, ignore_key) keys = res.data.members.reject { |a| a == ignore_key } keys.map { |k| [k, res.data[k]] }.to_h end
to_model(class_name, res)
click to toggle source
# File lib/dymos/model.rb, line 206 def self.to_model(class_name, res) if class_name.present? if res.data.respond_to? :items # scan, query metadata = extract(res, :items) res.data[:items].map do |datum| obj = Object.const_get(class_name).new(datum) obj.metadata = metadata obj.new_record = false obj end elsif res.data.respond_to? :attributes # put_item, update_item return nil if res.attributes.nil? obj = Object.const_get(class_name).new(res.attributes) obj.metadata = extract(res, :attributes) obj elsif res.respond_to? :data if res.data.respond_to? :item # get_item, delete_item return nil if res.data.item.nil? obj = Object.const_get(class_name).new(res.data.item) obj.metadata = extract(res, :item) obj.new_record = false obj else res.data.to_hash # describe end end else res.data.to_hash #list_tables end end
Public Instance Methods
attributes(raw=false)
click to toggle source
# File lib/dymos/model.rb, line 114 def attributes(raw=false) attrs = {} self.class.fields.keys.each do |name| attrs[name] = send "#{name}", raw if respond_to? "#{name}" end attrs end
attributes=(attributes = {}, initialize = false)
click to toggle source
# File lib/dymos/model.rb, line 106 def attributes=(attributes = {}, initialize = false) if attributes attributes.each do |attr, value| send("#{attr}=", value, initialize) if respond_to? "#{attr}=" end end end
class_name()
click to toggle source
@return [String]
# File lib/dymos/model.rb, line 182 def class_name self.class.name end
indexes()
click to toggle source
# File lib/dymos/model.rb, line 169 def indexes scheme = self.class.key_scheme.map do |scheme| [scheme[:attribute_name], send(scheme[:attribute_name])] end scheme.to_h end
method_missing(name, *args, &block)
click to toggle source
Calls superclass method
# File lib/dymos/model.rb, line 34 def method_missing(name, *args, &block) if Dymos.model_update_query_methods.include? name @query||={} @query[name]=args self else super end end
reload!()
click to toggle source
# File lib/dymos/model.rb, line 160 def reload! reset_changes end
Private Instance Methods
read_attribute(name)
click to toggle source
# File lib/dymos/model.rb, line 187 def read_attribute(name) @attributes[name.to_sym] end
to_b(val)
click to toggle source
# File lib/dymos/model.rb, line 196 def to_b(val) compare_value = val.class == String ? val.downcase : val case compare_value when "yes", "true", "ok", true, "1", 1, :true, :ok, :yes true else false end end
write_attribute(name, value, initialize=false)
click to toggle source
# File lib/dymos/model.rb, line 191 def write_attribute(name, value, initialize=false) self.send "#{name}_will_change!" unless (initialize or value == @attributes[name.to_sym]) @attributes[name.to_sym] = value end