Sha256: f123d576c338af9cdee817aff8611c82fc83efc83c4110f73579417b73ed5c0c

Contents?: true

Size: 1.99 KB

Versions: 13

Compression:

Stored size: 1.99 KB

Contents

require 'active_model/dirty'

# Overrides persistence methods, providing support for dirty tracking.
#
module ActiveRemote
  module Dirty
    extend ActiveSupport::Concern

    included do
      include ActiveModel::Dirty

      attr_accessor :_active_remote_track_changes
    end

    def disable_dirty_tracking
      @_active_remote_track_changes = false
    end

    def enable_dirty_tracking
      @_active_remote_track_changes = true
    end

    # Override #reload to provide dirty tracking.
    #
    def reload(*)
      super.tap do
        @previously_changed.try(:clear)
        changed_attributes.clear
      end
    end

    # Override #save to store changes as previous changes then clear them.
    #
    def save(*)
      if status = super
        @previously_changed = changes
        changed_attributes.clear
      end

      status
    end

    # Override #save to store changes as previous changes then clear them.
    #
    def save!(*)
      super.tap do
        @previously_changed = changes
        changed_attributes.clear
      end
    end

    def skip_dirty_tracking(&block)
      disable_dirty_tracking

      yield

      enable_dirty_tracking
    end

    # Override #write_attribute (along with #[]=) so we can provide support for
    # ActiveModel::Dirty.
    #
    def write_attribute(name, value)
      __send__("#{name}_will_change!") if _active_remote_track_changes? && value != self[name]
      super
    end
    alias_method :[]=, :write_attribute

  private

    # Wether or not changes are currently being tracked for this class.
    #
    def _active_remote_track_changes?
      @_active_remote_track_changes != false
    end

    # Override ActiveAttr's attribute= method so we can provide support for
    # ActiveModel::Dirty.
    #
    def attribute=(name, value)
      __send__("#{name}_will_change!") if _active_remote_track_changes? && value != self[name]
      super
    end

    # Override #update to only send changed attributes.
    #
    def update(*)
      super(changed)
    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
active_remote-2.3.0 lib/active_remote/dirty.rb
active_remote-2.2.0 lib/active_remote/dirty.rb
active_remote-2.1.1 lib/active_remote/dirty.rb
active_remote-2.1.0 lib/active_remote/dirty.rb
active_remote-2.1.0.rc2 lib/active_remote/dirty.rb
active_remote-2.1.0.rc1 lib/active_remote/dirty.rb
active_remote-2.1.0.beta2 lib/active_remote/dirty.rb
active_remote-2.1.0.beta1 lib/active_remote/dirty.rb
active_remote-2.0.2 lib/active_remote/dirty.rb
active_remote-2.0.1 lib/active_remote/dirty.rb
active_remote-2.0.0 lib/active_remote/dirty.rb
active_remote-2.0.0.rc2 lib/active_remote/dirty.rb
active_remote-2.0.0.rc1 lib/active_remote/dirty.rb