Sha256: b6a4822a936d9513723b3c1e556aecec65a5e73e652500ea0f98afea9fe6b162

Contents?: true

Size: 1.71 KB

Versions: 11

Compression:

Stored size: 1.71 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
        clear_changes_information
      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)
        changes_applied
      end

      status
    end

    # Override #save to store changes as previous changes then clear them.
    #
    def save!(*)
      super.tap do
        changes_applied
      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

11 entries across 11 versions & 1 rubygems

Version Path
active_remote-6.0.3 lib/active_remote/dirty.rb
active_remote-6.1.2 lib/active_remote/dirty.rb
active_remote-7.0.0 lib/active_remote/dirty.rb
active_remote-6.1.1 lib/active_remote/dirty.rb
active_remote-6.1.0 lib/active_remote/dirty.rb
active_remote-6.0.2 lib/active_remote/dirty.rb
active_remote-6.0.1 lib/active_remote/dirty.rb
active_remote-6.0.0.beta lib/active_remote/dirty.rb
active_remote-5.2.0 lib/active_remote/dirty.rb
active_remote-5.2.0.beta lib/active_remote/dirty.rb
active_remote-5.2.0.alpha lib/active_remote/dirty.rb