Sha256: 79c6e557d4663a0abd266678b81b14daef76548d96badf34be4c7a9372d45fb6

Contents?: true

Size: 1.6 KB

Versions: 2

Compression:

Stored size: 1.6 KB

Contents

require 'synchronisable/dsl/macro'

module Synchronisable
  module DSL
    # Association builder.
    # Subclasses must implement #macro method.
    class Association
      include Synchronisable::DSL::Macro

      KIND_KEY_SUFFIX_MAP = {
        :belongs_to => :id,
        :has_one => :id,
        :has_many => :ids
      }

      class << self
        attr_accessor :valid_options

        def create(synchronizer, kind, name, options)
          new(synchronizer, kind, name).create(options)
        end
      end

      self.valid_options = %i(key class_name required force_sync)

      attr_reader :kind, :name, :model, :key,
        :required, :force_sync

      def initialize(synchronizer, kind, name)
        @synchronizer, @kind, @name = synchronizer, kind, name.to_sym
        @key_suffix = KIND_KEY_SUFFIX_MAP[kind]
      end

      def create(options)
        validate_options(options)

        @key = options[:key]
        @required = options[:required]
        @force_sync = options[:force_sync]

        if options[:class_name].present?
          @model = options[:class_name].constantize
        end

        set_defaults

        @synchronizer.associations[@key] = self
      end

      def model_name
        @model.to_s.demodulize.underscore.to_sym
      end

      protected

      def set_defaults
        @required ||= false
        @force_sync ||= false

        @model ||= @name.to_s.classify.constantize
        @key = "#{@name}_#{@key_suffix}" unless @key.present?
      end

      private

      def validate_options(options)
        options.assert_valid_keys(Association.valid_options)
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
synchronisable-1.2.1 lib/synchronisable/dsl/association.rb
synchronisable-1.2.0 lib/synchronisable/dsl/association.rb