Sha256: a78419edbc40f0087628b5cb97120fcd996ae864b351d38b4efe6cc186aa530f

Contents?: true

Size: 1.28 KB

Versions: 1

Compression:

Stored size: 1.28 KB

Contents

require 'mongoid'
require 'active_support/concern'

module Mongoid
  module ExtendedDirtyTrackable
    extend ActiveSupport::Concern

    included do
      attr_writer :embedded_changes, :associated_changes
    end

    def associated_changes
      @associated_changes = begin
        self.associations.keys.inject({}) do |memo, association|
          _changes = msg_relative(association)
          memo.merge!(_changes)
          memo
        end
      end
    end

    def msg_relative(relationship)
      relative = self.send(relationship)

      if relative && !relative.is_a?(Array) && relative.changed?
        _changes = relative.changes
      elsif relative && relative.is_a?(Array) && relative.any?(&:changed)
        _changes = relative.inject({}) do |memo, obj|
          memo.merge!(obj.changes) if obj.changed?
        end
      end

      _changes || {}
    end

    def embedded_changes
      @embedded_changes = begin
        self.collect_children.inject({}) do |memo, child|
          memo.merge!(child.changes) if child.changed?
          memo
        end
      end
    end

    def changes
      from_super = super
      from_super.merge!(associated_changes)
      from_super.merge!(embedded_changes)
    end

    def changed?
      super || self._children.any?(&:changed?)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
mongoid_extended_dirty_trackable-0.2.0 lib/mongoid/extended_dirty_trackable.rb