Sha256: dcc4cad0072fdf26e6155955c41917f104342589e74dc2a5735ab3007c9e91f5

Contents?: true

Size: 1.84 KB

Versions: 6

Compression:

Stored size: 1.84 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 #remote to provide dirty tracking.
    #
    def remote(*)
      super.tap do
        clear_changes_information
      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
      disable_dirty_tracking

      yield

      enable_dirty_tracking
    end

  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 remote_update(*)
      super(changed)
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
active_remote-5.0.1 lib/active_remote/dirty.rb
active_remote-5.1.1 lib/active_remote/dirty.rb
active_remote-5.1.0 lib/active_remote/dirty.rb
active_remote-5.0.0 lib/active_remote/dirty.rb
active_remote-5.1.0.rc1 lib/active_remote/dirty.rb
active_remote-5.0.0.rc1 lib/active_remote/dirty.rb