Sha256: f627c3ae72e9394925e20f6bd9d5d25ec2be8e653ea8928d0db73501a7e93274

Contents?: true

Size: 1.7 KB

Versions: 2

Compression:

Stored size: 1.7 KB

Contents

module Embedson
  module Model
    class EmbedsBuilder
      attr_reader :builder, :klass

      def initialize(builder)
        @builder = builder
        @klass = builder.klass
      end

      def define
        methods_embeds.each do |meth|
          klass.class_exec builder, &send(meth)
        end
      end

      private

      def methods_embeds
        [:writer, :reader, :related_model, :build_related_model]
      end

      def writer
        proc do |builder|
          define_method("#{builder.field_name}=") do |arg|
            verify_arg_klass(arg)
            send_self_to_related(arg)

            instance_variable_set(builder.instance_var_name, arg)
            write_attribute(builder.column_name, arg.nil? ? arg : arg.to_h)
          end
        end
      end

      def reader
        proc do |builder|
          define_method(builder.field_name) do
            return if read_attribute(builder.column_name).nil?

            build_related_model if instance_variable_get(builder.instance_var_name).nil?
            instance_variable_get(builder.instance_var_name)
          end
        end
      end

      def related_model
        proc do |builder|
          private

          define_method('related_model') do
            builder.related_klass_name.constantize.new(read_attribute(builder.column_name))
          end
        end
      end

      def build_related_model
        proc do |builder|
          private

          define_method('build_related_model') do
            instance_variable_set(builder.instance_var_name, related_model)
            related_model.public_send(builder.inverse_set, self) if related_model.respond_to?(builder.inverse_set)
          end
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
embedson-1.0.2 lib/embedson/model/embeds_builder.rb
embedson-1.0.1 lib/embedson/model/embeds_builder.rb