Sha256: 93db68ebbba760f0e385f0a5cddc78619d91e80e672730fce0b311796a3b0ac0

Contents?: true

Size: 1.76 KB

Versions: 18

Compression:

Stored size: 1.76 KB

Contents

module Reviewed
  module Embeddable

    def self.included(klass)
      klass.extend(Reviewed::Embeddable::ClassMethods)
    end

    class << self

      def embedded_class(name, opts_name=nil)
        name = opts_name ? opts_name : embedded_name(name)
        name.constantize
      end

      def embedded_name(name)
        ["Reviewed", name.singularize.classify].join("::")
      end
    end

    def objectify(data)
      data = objectify_has_many(data)
      data = objectify_has_one(data)
      return data
    end

    def objectify_has_many(json)
      self.class._embedded_many.each do |map|
        key, value = [map.keys[0], map.values[0]]

        if json.has_key?(key)
          json[key] = json[key].map do |obj|
            value.new(obj)
          end
        end
      end
      return json
    end

    def objectify_has_one(json)
      self.class._embedded_one.each do |map|
        key, value = [map.keys[0], map.values[0]]

        if json.has_key?(key)
          json[key] = value.new(json[key])
        end
      end
      return json
    end

    module ClassMethods
      attr_accessor :_embedded_many, :_embedded_one

      def has_attachments
        include Attachable
      end

      def has_many(name, opts={})
        klass = Reviewed::Embeddable.embedded_class(name.to_s, opts[:class_name])
        association = opts[:as] || name
        _embedded_many << { association.to_s => klass }
      end

      def has_one(name, opts={})
        klass = Reviewed::Embeddable.embedded_class(name.to_s, opts[:class_name])
        association = opts[:as] || name
        _embedded_one << { association.to_s => klass }
      end

      def _embedded_many
        @_embedded_many ||= []
      end

      def _embedded_one
        @_embedded_one ||= []
      end
    end
  end
end

Version data entries

18 entries across 18 versions & 1 rubygems

Version Path
reviewed-0.9.1 lib/reviewed/embeddable.rb
reviewed-0.9.0 lib/reviewed/embeddable.rb
reviewed-0.8.0 lib/reviewed/embeddable.rb
reviewed-0.7.1 lib/reviewed/embeddable.rb
reviewed-0.7 lib/reviewed/embeddable.rb
reviewed-0.6.4 lib/reviewed/embeddable.rb
reviewed-0.6.3 lib/reviewed/embeddable.rb
reviewed-0.6.2 lib/reviewed/embeddable.rb
reviewed-0.6.1 lib/reviewed/embeddable.rb
reviewed-0.6.0 lib/reviewed/embeddable.rb
reviewed-0.5.0 lib/reviewed/embeddable.rb
reviewed-0.4.6 lib/reviewed/embeddable.rb
reviewed-0.4.5 lib/reviewed/embeddable.rb
reviewed-0.4.4 lib/reviewed/embeddable.rb
reviewed-0.4.3 lib/reviewed/embeddable.rb
reviewed-0.4.2 lib/reviewed/embeddable.rb
reviewed-0.4.1 lib/reviewed/embeddable.rb
reviewed-0.4.0 lib/reviewed/embeddable.rb