Class: Maintain::Backend::ActiveRecord

Inherits:
Base
  • Object
show all
Defined in:
lib/maintain/backend/active_record.rb

Instance Attribute Summary

Attributes inherited from Base

#maintainer

Instance Method Summary collapse

Instance Method Details

#aggregate(maintainee, name, attribute, states, options = {}) ⇒ Object



4
5
6
7
# File 'lib/maintain/backend/active_record.rb', line 4

def aggregate(maintainee, name, attribute, states, options = {})
  # named_scope will handle the array of states as "IN" in SQL
  state(maintainee, name, attribute, states, options.merge(dirty: false))
end

#on(maintainee, attribute, event, state, method, options) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/maintain/backend/active_record.rb', line 9

def on(maintainee, attribute, event, state, method, options)
  attribute_check = "#{attribute}#{"_was" if event == :exit}_#{state}?"
  hook_method = options[:after] ? :after : :before
  maintainee.send("#{hook_method}_save", method, if: lambda {|instance|
    if instance.send("#{attribute}_changed?") && instance.send(attribute_check)
      if options[:if]
        Maintainer.call_method_or_proc(options[:if], instance)
      elsif options[:unless]
        !Maintainer.call_method_or_proc(options[:unless], instance)
      else
        true
      end
    else
      false
    end
  })
end

#read(instance, attribute) ⇒ Object



27
28
29
# File 'lib/maintain/backend/active_record.rb', line 27

def read(instance, attribute)
  instance.read_attribute(attribute)
end

#state(maintainee, name, attribute, value, options = {}) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/maintain/backend/active_record.rb', line 31

def state(maintainee, name, attribute, value, options = {})
  options = {dirty: true}.merge(options)
  conditions = {conditions: {attribute => value}}
  version = defined?(::ActiveRecord::VERSION) && ::ActiveRecord::VERSION::STRING
  force = !maintainee.respond_to?(name) || options[:force]
  if version && version >= '3'
    where = "lambda { where(#{conditions[:conditions].inspect}) }"
    maintainee.class_eval "scope :#{name}, #{where}" if force
    maintainee.class_eval "scope :#{attribute}_#{name}, #{where}"
  else
    maintainee.named_scope(name, conditions)
    maintainee.named_scope("#{attribute}_#{name}", conditions)
  end

  if options[:dirty]
    maintainee.class_eval <<-dirty_tracker
      def #{attribute}_was_#{name}?
        #{attribute}_was == self.class.maintainers[:#{attribute}].value(self).value_for(:#{name})
      end
    dirty_tracker
  end
end

#write(instance, attribute, value) ⇒ Object



54
55
56
# File 'lib/maintain/backend/active_record.rb', line 54

def write(instance, attribute, value)
  instance.send(:write_attribute, attribute, value)
end