Module: Globalize::ActiveRecord::AdapterDirty

Included in:
Adapter
Defined in:
lib/globalize/active_record/adapter_dirty.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#dirtyObject



27
28
29
# File 'lib/globalize/active_record/adapter_dirty.rb', line 27

def dirty
  @dirty ||= {}
end

Instance Method Details

#_reset_attribute(name) ⇒ Object



43
44
45
# File 'lib/globalize/active_record/adapter_dirty.rb', line 43

def _reset_attribute name
  record.send(:restore_attribute!, name) if record.respond_to? :restore_attribute!, true
end

#clear_dirtyObject



39
40
41
# File 'lib/globalize/active_record/adapter_dirty.rb', line 39

def clear_dirty
  self.dirty = {}
end

#resetObject



47
48
49
50
# File 'lib/globalize/active_record/adapter_dirty.rb', line 47

def reset
  clear_dirty
  super
end

#store_old_value(name, locale) ⇒ Object



31
32
33
34
35
36
37
38
# File 'lib/globalize/active_record/adapter_dirty.rb', line 31

def store_old_value name, locale
  dirty[name] ||= {}
  unless dirty[name].key? locale
    old = fetch(locale, name)
    old = old.dup if old.duplicable?
    dirty[name][locale] = old
  end
end

#write(locale, name, value) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/globalize/active_record/adapter_dirty.rb', line 4

def write locale, name, value
  # Dirty tracking, paraphrased from
  # ActiveRecord::AttributeMethods::Dirty#write_attribute.
  name = name.to_s
  store_old_value name, locale
  old_values = dirty[name]
  old_value = old_values[locale]
  is_changed = record.send :attribute_changed?, name
  if is_changed && value == old_value
    # If there's already a change, delete it if this undoes the change.
    old_values.delete locale
    if old_values.empty?
      _reset_attribute name
    end
  elsif !is_changed
    # If there's not a change yet, record it.
    record.send(:attribute_will_change!, name) if old_value != value
  end

  super locale, name, value
end