Sha256: 1e5d4896538ff761269cf6fb343cb47e786be9f8bc68ad080209266a08875b97

Contents?: true

Size: 1.83 KB

Versions: 6

Compression:

Stored size: 1.83 KB

Contents

require 'delegate'

module DBViewCTI
  module Model
    
    class ModelDelegator < SimpleDelegator
      
      attr_reader :cti_target_class

      def initialize(object, target_class)
        @cti_object = object
        @cti_converted_object = object.convert_to(target_class)
        if !@cti_converted_object
          @cti_converted_object = target_class.constantize.new
          @cti_is_new = true
        end
        disable_validations
        @cti_target_class = target_class
        super( @cti_converted_object )
      end
      
      def cti_is_new?
        @cti_is_new
      end
      
      def save(*args, &block)
        return super unless cti_is_new?
        # special case for new objects, we need to manually set the id and trick the object
        # to think it was already persisted, so we get an update instead of an insert
        new_id = @cti_object.convert_to( @cti_target_class ).id
        self.id = new_id
        force_persisted_state
        self.created_at = @cti_object.created_at
        self.updated_at = @cti_object.updated_at
        retval = !!super
        # throw away just saved object and convert from scratch
        @cti_converted_object = @cti_object.convert_to( @cti_target_class )
        disable_validations
        __setobj__(@cti_converted_object)
        return retval
      end
      
      private
      
        def disable_validations(object = nil)
          object ||= @cti_converted_object
          object.cti_disable_validations = true
        end
        
        module ForcePersistedState
          def persisted?
            true
          end
          
          def new_record?
            false
          end
        end
      
        def force_persisted_state(object = nil)
          object ||= @cti_converted_object
          object.extend( ForcePersistedState )
        end

    end
    
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
dbview_cti-0.2.3 lib/db_view_cti/model/model_delegator.rb
dbview_cti-0.2.2 lib/db_view_cti/model/model_delegator.rb
dbview_cti-0.2.1 lib/db_view_cti/model/model_delegator.rb
dbview_cti-0.2.0 lib/db_view_cti/model/model_delegator.rb
dbview_cti-0.1.5 lib/db_view_cti/model/model_delegator.rb
dbview_cti-0.1.4 lib/db_view_cti/model/model_delegator.rb