Sha256: 9f3e8a3946f00ff63d18f33d1bd18918bdab3bd2b567d4211cbe7708a4bfcfe6

Contents?: true

Size: 1.03 KB

Versions: 2

Compression:

Stored size: 1.03 KB

Contents

module Billogram
  class RelationBuilder
    attr_reader :resource, :attributes

    def initialize(resource, attributes)
      @resource = resource
      @attributes = attributes
    end

    def call
      resource_relations.each do |type, relation_names|
        build_relation(type, relation_names)
      end
    end

    private

    def relation_class(relation_name)
      Object.const_get("Billogram::#{relation_name.to_s.split('_').map(&:capitalize).join()}")
    end

    def relation_attributes(relation_name)
      attributes.delete(relation_name.to_s)
    end

    def resource_relations
      resource.class.relations
    end

    def build_relation(type, relation_names)
      relation_names.each do |name|
        if attrs = relation_attributes(name)
          if type == :one
            value = relation_class(name).new(attrs)
          elsif type == :many
            value = attrs.map{|item| relation_class(name[0..-2]).new(item) }
          end

          resource.public_send("#{name}=", value)
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
billogram-0.3.1 lib/billogram/relation_builder.rb
billogram-0.3.0 lib/billogram/relation_builder.rb