Module: MongoMapper::Dirty

Defined in:
lib/mongo_mapper/dirty.rb

Constant Summary collapse

DIRTY_SUFFIXES =
['_changed?', '_change', '_will_change!', '_was']

Class Method Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/mongo_mapper/dirty.rb', line 11

def method_missing(method, *args, &block)
  if method.to_s =~ /(_changed\?|_change|_will_change!|_was)$/
    method_suffix = $1
    key = method.to_s.gsub(method_suffix, '')
    
    if key_names.include?(key)
      case method_suffix
        when '_changed?'
          key_changed?(key)
        when '_change'
          key_change(key)
        when '_will_change!'
          key_will_change!(key)
        when '_was'
          key_was(key)
      end
    else
      super
    end
  else
    super
  end
end

Class Method Details

.included(base) ⇒ Object



5
6
7
8
9
# File 'lib/mongo_mapper/dirty.rb', line 5

def self.included(base)
  base.alias_method_chain :write_attribute, :dirty
  base.alias_method_chain :save,            :dirty
  base.alias_method_chain :save!,           :dirty
end

Instance Method Details

#changedObject

List of keys with unsaved changes.

person.changed # => []
person.name = 'bob'
person.changed # => ['name']


43
44
45
# File 'lib/mongo_mapper/dirty.rb', line 43

def changed
  changed_keys.keys
end

#changed?Boolean

Returns:



35
36
37
# File 'lib/mongo_mapper/dirty.rb', line 35

def changed?
  !changed_keys.empty?
end

#changesObject

Map of changed attrs => [original value, new value].

person.changes # => {}
person.name = 'bob'
person.changes # => { 'name' => ['bill', 'bob'] }


51
52
53
# File 'lib/mongo_mapper/dirty.rb', line 51

def changes
  changed.inject({}) { |h, attribute| h[attribute] = key_change(attribute); h }
end

#save_with_dirty(*args) ⇒ Object

Attempts to save the record and clears changed keys if successful.



56
57
58
59
60
61
# File 'lib/mongo_mapper/dirty.rb', line 56

def save_with_dirty(*args) #:nodoc:
  if status = save_without_dirty(*args)
    changed_keys.clear
  end
  status
end

#save_with_dirty!(*args) ⇒ Object

Attempts to save! the record and clears changed keys if successful.



64
65
66
67
68
# File 'lib/mongo_mapper/dirty.rb', line 64

def save_with_dirty!(*args) #:nodoc:
  status = save_without_dirty!(*args)
  changed_keys.clear
  status
end