class Loco::Adapter

Public Class Methods

get_transforms() click to toggle source
# File lib/motion-loco/adapter.rb, line 73
def get_transforms
  if @transforms.nil?
    @transforms = {}
    if self.superclass.respond_to? :get_transforms
      @transforms.merge!(self.superclass.get_transforms)
    end
  end
  @transforms
end
registerTransform(name, transforms={})
Alias for: register_transform
register_transform(name, transforms={}) click to toggle source
# File lib/motion-loco/adapter.rb, line 83
def register_transform(name, transforms={})
  @transforms = get_transforms
  @transforms[name.to_sym] = transforms
end
Also aliased as: registerTransform

Public Instance Methods

create_record(record, &block) click to toggle source
# File lib/motion-loco/adapter.rb, line 7
def create_record(record, &block)
  raise NoMethodError, "Loco::Adapter subclasses must implement #create_record(record, &block)."
end
delete_record(record, &block) click to toggle source
# File lib/motion-loco/adapter.rb, line 11
def delete_record(record, &block)
  raise NoMethodError, "Loco::Adapter subclasses must implement #delete_record(record, &block)."
end
find(record, id, &block) click to toggle source
# File lib/motion-loco/adapter.rb, line 15
def find(record, id, &block)
  raise NoMethodError, "Loco::Adapter subclasses must implement #find(record, id, &block)."
end
find_all(type, records, &block) click to toggle source
# File lib/motion-loco/adapter.rb, line 19
def find_all(type, records, &block)
  raise NoMethodError, "Loco::Adapter subclasses must implement #find_all(type, records, &block)."
end
find_many(type, records, ids, &block) click to toggle source
# File lib/motion-loco/adapter.rb, line 23
def find_many(type, records, ids, &block)
  raise NoMethodError, "Loco::Adapter subclasses must implement #find_many(type, records, ids, &block)."
end
find_query(type, records, params, &block) click to toggle source
# File lib/motion-loco/adapter.rb, line 27
def find_query(type, records, params, &block)
  raise NoMethodError, "Loco::Adapter subclasses must implement #find_query(type, records, params, &block)."
end
serialize(record, options={}, json={}) click to toggle source
# File lib/motion-loco/adapter.rb, line 35
def serialize(record, options={}, json={})
  properties = record.class.get_class_properties.select{|prop| 
    if prop[:type]
      if prop[:name] == :id
        options[:include_id] || options[:includeId]
      else
        true
      end
    end
  }
  
  transforms = self.class.get_transforms
  
  properties.each do |property|
    key = property[:name].to_sym
    transform = transforms[property[:type]]
    if transform
      json[key] = transform[:serialize].call(record.valueForKey(key))
    else
      json[key] = record.valueForKey(key)
    end
  end
  
  if options[:root] != false
    if options[:root].nil? || options[:root] == true
      root = record.class.to_s.underscore.to_sym
    else
      root = options[:root].to_sym
    end
    temp = {}
    temp[root] = json
    json = temp
  end
  json
end
update_record(record, &block) click to toggle source
# File lib/motion-loco/adapter.rb, line 31
def update_record(record, &block)
  raise NoMethodError, "Loco::Adapter subclasses must implement #update_record(record, &block)."
end

Private Instance Methods

load(type, records, data) click to toggle source
# File lib/motion-loco/adapter.rb, line 93
def load(type, records, data)
  if records.is_a? RecordArray
    if data.is_a? Hash
      data = data[type.to_s.underscore.pluralize]
    end
    records.load(type, transform_data(type, data))
  else
    if data.is_a?(Hash) && data.has_key?(type.to_s.underscore)
      data = data[type.to_s.underscore] 
    end
    records.load(data.valueForKey(:id), transform_data(type, data))
  end
end
transform_data(type, data) click to toggle source
# File lib/motion-loco/adapter.rb, line 133
def transform_data(type, data)
  if data.is_a? Array
    json = []
    data.each do |data_item|
      json << transform_data_item(type, data_item)
    end
    json
  else
    transform_data_item(type, data)
  end
end
transform_data_item(type, data) click to toggle source
# File lib/motion-loco/adapter.rb, line 107
def transform_data_item(type, data)
  json = {}
  transforms = self.class.get_transforms
  
  type.get_class_properties.each do |property|
    key = property[:name].to_sym
    transform = transforms[property[:type]]
    if transform
      json[key] = transform[:deserialize].call(data.valueForKey(key))
    else
      json[key] = data.valueForKey(key)
    end
  end
  
  type.get_class_relationships.each do |relationship|
    if relationship[:belongs_to]
      key = "#{relationship[:belongs_to]}_id".to_sym
    elsif relationship[:has_many]
      key = "#{relationship[:has_many].to_s.singularize}_ids".to_sym
    end
    json[key] = data.valueForKey(key)
  end
  
  json
end