Sha256: eaa790c5745b02ad8bb838c7c34ed064f59a665b55040b11fd31e981b3f2be22

Contents?: true

Size: 1.35 KB

Versions: 3

Compression:

Stored size: 1.35 KB

Contents

class LogicalModel
  module BelongsTo

    def self.included(base)
      base.send(:extend, ClassMethods)
    end

    module ClassMethods
      # @param key [String] association name
      # @param options [Hash]
      # @option options [String/Constant] class
      def belongs_to(key, options = {})
        attr_accessor "#{key}_id"
        attr_class = get_attr_class(key, options)

        define_method("#{key}=") do |param|
          param.stringify_keys!

          instance_variable_set("@#{key}_id", param['id']) if param['id']

          instance = attr_class.new(param)

          instance_variable_set("@#{key}",instance)
        end

        define_method(key) do
          eval("@#{key}")
        end

        # TODO define_method("#{key}_attribute="){|param| ... }

        define_method "new_#{key}" do |param|
          attr_class

          return unless attr_class

          temp_object = attr_class.new(param.merge({"#{self.json_root}_id" => self.id}))
          eval(key.to_s) << temp_object
          temp_object
        end
      end

      private

      def get_attr_class(key, options)
        if options[:class]
          attr_class = options[:class].is_a?(String) ? options[:class].constantize : options[:class]
        else
          attr_class = key.to_s.singularize.camelize.constantize
        end
        attr_class
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
logical_model-0.5.5 lib/logical_model/belongs_to.rb
logical_model-0.5.4 lib/logical_model/belongs_to.rb
logical_model-0.5.3 lib/logical_model/belongs_to.rb