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