Module: Countrizable::ActiveRecord::AdapterDirty

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#dirtyObject



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

def dirty
  @dirty ||= {}
end

Instance Method Details

#_reset_attribute(name) ⇒ Object



44
45
46
47
# File 'lib/countrizable/active_record/adapter_dirty.rb', line 44

def _reset_attribute name
  record.send("#{name}=", record.changed_attributes[name])
  record.send(:clear_attribute_changes, [name])
end

#clear_dirtyObject



40
41
42
# File 'lib/countrizable/active_record/adapter_dirty.rb', line 40

def clear_dirty
  self.dirty = {}
end

#resetObject



49
50
51
52
# File 'lib/countrizable/active_record/adapter_dirty.rb', line 49

def reset
  clear_dirty
  super
end

#store_old_value(name, country_code) ⇒ Object



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

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

#write(country_code, 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/countrizable/active_record/adapter_dirty.rb', line 4

def write country_code, name, value
  # Dirty tracking, paraphrased from
  # ActiveRecord::AttributeMethods::Dirty#write_attribute.
  name = name.to_s
  store_old_value name, country_code
  old_values = dirty[name]
  old_value = old_values[country_code]
  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 country_code
    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 country_code, name, value
end