class MetaModel::MetaModel

Attributes

id[R]
type[R]

Public Class Methods

new(jsonapi_resource, index = nil) click to toggle source
# File lib/meta_model/meta_model.rb, line 6
def initialize(jsonapi_resource, index = nil)
  @jsonapi_resource = jsonapi_resource
  @type = jsonapi_resource[:data][:type]
  @id = jsonapi_resource[:data][:id]
  @attributes = jsonapi_resource[:data][:attributes] || {}
  @relationships = jsonapi_resource[:data][:relationships] || []
  @included = jsonapi_resource[:included] || []
  @index = index || Hash.new
  index_includes
  set_attributes if @attributes.size > 0
  populate_relationships if @relationships.size > 0
end

Public Instance Methods

setup_serializer(serializer) click to toggle source
# File lib/meta_model/meta_model.rb, line 19
    def setup_serializer(serializer)
      keys = (@attributes.keys + [:id]).join(', :')
      serializer.singleton_class.class_eval <<-end_eval
      self._attributes_data = {}
      self._reflections = []
      attributes :#{keys}
      end_eval

      @relationships.each do |relationship_name, value|
        relationship = value.is_a?(Array) ? "has_many" : "has_one"
        serializer.singleton_class.class_eval <<-end_eval
        #{relationship} :#{relationship_name}
        def #{relationship_name}
          object.#{relationship_name}
        end
        end_eval
      end
    end

Private Instance Methods

index_includes() click to toggle source
# File lib/meta_model/meta_model.rb, line 40
def index_includes
  @included.each do |resource|
    id, type = resource[:id], resource[:type]
    key = "#{type}_#{id}"
    next if @index[key].present?
    to_pass = {}
    object = MetaModel.new({data: resource, included: @included.reject { |obj| obj.object_id == resource.object_id }}, to_pass.merge!(@index))
    @index = to_pass
    @index[key] = object
  end
end
multi_relationship_setup(value) click to toggle source
# File lib/meta_model/meta_model.rb, line 79
def multi_relationship_setup(value)
  value.map do |resource_id|
    resource_lookup resource_id
  end
end
populate_relationships() click to toggle source
# File lib/meta_model/meta_model.rb, line 62
    def populate_relationships
      keys = @relationships.keys.join(', :')
      self.singleton_class.class_eval <<-end_eval
      attr_accessor :#{keys}
      end_eval

      @relationships.each do |relationship_name, value|
        internal = value[:data]
        next if internal.nil?
        if internal.is_a? Array
          self.send("#{relationship_name}=", multi_relationship_setup(internal))
        else
          self.send("#{relationship_name}=", single_relationship_setup(internal))
        end
      end
    end
resource_lookup(value) click to toggle source
# File lib/meta_model/meta_model.rb, line 89
def resource_lookup(value)
  @index["#{value[:type]}_#{value[:id]}"] || MetaModel.new({data: value})
end
set_attributes() click to toggle source
# File lib/meta_model/meta_model.rb, line 52
    def set_attributes
      keys = (@attributes.keys).join(', :')
      self.singleton_class.class_eval <<-end_eval
      attr_accessor :#{keys}
      end_eval
      @attributes.each do |key, value|
        self.send("#{key}=", value)
      end
    end
single_relationship_setup(value) click to toggle source
# File lib/meta_model/meta_model.rb, line 85
def single_relationship_setup(value)
  resource_lookup value
end