module Mongoid::History::Tracker

Attributes

trackable[W]

Public Instance Methods

affected() click to toggle source
# File lib/mongoid/history/tracker.rb, line 79
def affected
  @affected ||= (modified.keys | original.keys).inject({}){ |h,k| h[k] =
    trackable ? trackable.attributes[k] : modified[k]; h}
end
redo!(modifier) click to toggle source
# File lib/mongoid/history/tracker.rb, line 37
def redo!(modifier)
  if action.to_sym == :destroy
    re_destroy
  elsif action.to_sym == :create
    re_create
  else
    trackable.update_attributes!(redo_attr(modifier))
  end
end
redo_attr(modifier) click to toggle source
# File lib/mongoid/history/tracker.rb, line 55
def redo_attr(modifier)
  redo_hash = affected.easy_unmerge(original)
  redo_hash.easy_merge!(modified)
  modifier_field = trackable.history_trackable_options[:modifier_field]
  redo_hash[modifier_field] = modifier
  redo_hash
end
trackable() click to toggle source
# File lib/mongoid/history/tracker.rb, line 67
def trackable
  @trackable ||= trackable_parents_and_trackable.last
end
trackable_parent() click to toggle source
# File lib/mongoid/history/tracker.rb, line 75
def trackable_parent
  @trackable_parent ||= trackable_parents_and_trackable[-2]
end
trackable_parents() click to toggle source
# File lib/mongoid/history/tracker.rb, line 71
def trackable_parents
  @trackable_parents ||= trackable_parents_and_trackable[0, -1]
end
trackable_root() click to toggle source
# File lib/mongoid/history/tracker.rb, line 63
def trackable_root
  @trackable_root ||= trackable_parents_and_trackable.first
end
undo!(modifier) click to toggle source
# File lib/mongoid/history/tracker.rb, line 27
def undo!(modifier)
  if action.to_sym == :destroy
    re_create
  elsif action.to_sym == :create
    re_destroy
  else
    trackable.update_attributes!(undo_attr(modifier))
  end
end
undo_attr(modifier) click to toggle source
# File lib/mongoid/history/tracker.rb, line 47
def undo_attr(modifier)
  undo_hash = affected.easy_unmerge(modified)
  undo_hash.easy_merge!(original)
  modifier_field = trackable.history_trackable_options[:modifier_field]
  undo_hash[modifier_field] = modifier
  undo_hash
end

Private Instance Methods

create_on_parent() click to toggle source
# File lib/mongoid/history/tracker.rb, line 100
def create_on_parent
  name = association_chain.last["name"]
  if embeds_one?(trackable_parent, name)
    trackable_parent.send("create_#{name}!", modified)
  elsif embeds_many?(trackable_parent, name)
     trackable_parent.send(name).create!(modified)
  else
    raise "This should never happen. Please report bug!"
  end
end
create_standalone() click to toggle source
# File lib/mongoid/history/tracker.rb, line 94
def create_standalone
  class_name = association_chain.first["name"]
  restored = class_name.constantize.new(modified)
  restored.save!
end
embeds_many?(doc, name) click to toggle source
# File lib/mongoid/history/tracker.rb, line 124
def embeds_many?(doc, name)
  relation_of(doc, name) == Mongoid::Relations::Embedded::Many
end
embeds_one?(doc, name) click to toggle source
# File lib/mongoid/history/tracker.rb, line 120
def embeds_one?(doc, name)
  relation_of(doc, name) == Mongoid::Relations::Embedded::One
end
re_create() click to toggle source
# File lib/mongoid/history/tracker.rb, line 86
def re_create
  association_chain.length > 1 ? create_on_parent : create_standalone
end
re_destroy() click to toggle source
# File lib/mongoid/history/tracker.rb, line 90
def re_destroy
  trackable.destroy
end
relation_of(doc, name) click to toggle source
# File lib/mongoid/history/tracker.rb, line 115
def relation_of(doc, name)
  meta = doc.reflect_on_association(name)
  meta ? meta.relation : nil
end
trackable_parents_and_trackable() click to toggle source
# File lib/mongoid/history/tracker.rb, line 111
def trackable_parents_and_trackable
  @trackable_parents_and_trackable ||= traverse_association_chain
end
traverse_association_chain() click to toggle source
# File lib/mongoid/history/tracker.rb, line 128
def traverse_association_chain
  chain = association_chain.dup
  doc = nil
  documents = []

  begin
    node = chain.shift
    name = node['name']

    doc = if doc.nil?
      # root association. First element of the association chain
      klass = name.classify.constantize
      klass.where(:_id => node['id']).first
    elsif embeds_one?(doc, name)
      doc.send(name)
    elsif embeds_many?(doc, name)
      doc.send(name).where(:_id => node['id']).first
    else
      raise "This should never happen. Please report bug."
    end
    documents << doc
  end while( !chain.empty? )
  documents
end