Module: Mongoid::Dirty

Extended by:
ActiveSupport::Concern
Included in:
Components
Defined in:
lib/mongoid/dirty.rb

Overview

:nodoc:

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#changedArray<String>

Get the changed attributes for the document.

Examples:

Get the changed attributes.

model.changed

Returns:

Since:

  • 2.4.0



14
15
16
# File 'lib/mongoid/dirty.rb', line 14

def changed
  changed_attributes.keys
end

#changed?true, false

Has the document changed?

Examples:

Has the document changed?

model.changed?

Returns:

  • (true, false)

    If the document is changed.

Since:

  • 2.4.0



26
27
28
# File 'lib/mongoid/dirty.rb', line 26

def changed?
  changed_attributes.any?
end

#changed_attributesHash<String, Object>

Get the attribute changes.

Examples:

Get the attribute changes.

model.changed_attributes

Returns:

Since:

  • 2.4.0



38
39
40
# File 'lib/mongoid/dirty.rb', line 38

def changed_attributes
  @changed_attributes ||= {}
end

#changesHash<String, Array<Object, Object> ] The changes.

Get all the changes for the document.

Examples:

Get all the changes.

model.changes

Returns:

Since:

  • 2.4.0



50
51
52
53
54
55
56
# File 'lib/mongoid/dirty.rb', line 50

def changes
  changed.inject({}.with_indifferent_access) do |changes, attr|
    changes.tap do |hash|
      hash[attr] = attribute_change(attr)
    end
  end
end

#move_changesObject

Call this method after save, so the changes can be properly switched.

This will unset the memoized children array, set new record to false, set the document as validated, and move the dirty changes.

Examples:

Move the changes to previous.

person.move_changes

Since:

  • 2.1.0



67
68
69
70
71
72
73
74
# File 'lib/mongoid/dirty.rb', line 67

def move_changes
  @_children = nil
  @previous_changes = changes
  Atomic::UPDATES.each do |update|
    send(update).clear
  end
  changed_attributes.clear
end

#previous_changesHash<String, Array<Object, Object> ] The previous changes.

Get the previous changes on the document.

Examples:

Get the previous changes.

model.previous_changes

Returns:

Since:

  • 2.4.0



84
85
86
# File 'lib/mongoid/dirty.rb', line 84

def previous_changes
  @previous_changes
end

#remove_change(name) ⇒ Object

Remove a change from the dirty attributes hash. Used by the single field atomic updators.

Examples:

Remove a flagged change.

model.remove_change(:field)

Parameters:

Since:

  • 2.1.0



97
98
99
# File 'lib/mongoid/dirty.rb', line 97

def remove_change(name)
  changed_attributes.delete(name.to_s)
end

#settersHash

Gets all the new values for each of the changed fields, to be passed to a MongoDB $set modifier.

@todo: Durran: Refactor 3.0

Examples:

Get the setters for the atomic updates.

person = Person.new(:title => "Sir")
person.title = "Madam"
person.setters # returns { "title" => "Madam" }

Returns:

  • (Hash)

    A Hash of atomic setters.



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/mongoid/dirty.rb', line 112

def setters
  {}.tap do |modifications|
    changes.each_pair do |name, changes|
      if changes
        old, new = changes
        field = fields[name]
        key = embedded? ? "#{atomic_position}.#{name}" : name
        if field && field.resizable?
          pushes, pulls = new - (old || []), (old || []) - new
          field.add_atomic_changes(self, key, modifications, pushes, pulls)
        else
          modifications[key] = new
        end
      end
    end
  end
end