Module: FatJam::ActsAsRevisable::Revision

Defined in:
lib/acts_as_revisable/acts/revision.rb

Overview

This module is mixed into the revision classes.

Callbacks

  • before_restore is called on the revision class before it is restored as the current record.

  • after_restore is called on the revision class after it is restored as the current record.

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object

:nodoc:



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/acts_as_revisable/acts/revision.rb', line 14

def self.included(base) #:nodoc:
  base.send(:extend, ClassMethods)
  
  class << base
    attr_accessor :revisable_revisable_class, :revisable_cloned_associations
  end
  
  base.instance_eval do
    set_table_name(revisable_class.table_name)
    acts_as_scoped_model :find => {:conditions => {:revisable_is_current => false}}
    
    CloneAssociations.clone_associations(revisable_class, self)
  
    define_callbacks :before_restore, :after_restore
    before_create :revision_setup
    after_create :grab_my_branches
    
    [:current_revision, revisable_association_name.to_sym].each do |a|
      belongs_to a, :class_name => revisable_class_name, :foreign_key => :revisable_original_id
    end
    
    [[:ancestors, "<"], [:descendants, ">"]].each do |a|
      # Jumping through hoops here to try and make sure the
      # :finder_sql is cross-database compatible. :finder_sql
      # in a plugin is evil but, I see no other option.
      has_many a.first, :class_name => revision_class_name, :finder_sql => "select * from #{quoted_table_name} where #{quote_bound_value(:revisable_original_id)} = \#{revisable_original_id} and #{quote_bound_value(:revisable_number)} #{a.last} \#{revisable_number} and #{quote_bound_value(:revisable_is_current)} = #{quote_value(false)} order by #{quote_bound_value(:revisable_number)} #{(a.last.eql?("<") ? "DESC" : "ASC")}"
    end
  end
end

Instance Method Details

#find_revision(*args) ⇒ Object



44
45
46
# File 'lib/acts_as_revisable/acts/revision.rb', line 44

def find_revision(*args)
  current_revision.find_revision(*args)
end

#from_revisableObject



84
85
86
# File 'lib/acts_as_revisable/acts/revision.rb', line 84

def from_revisable
  current_revision.for_revision
end

#grab_my_branchesObject



80
81
82
# File 'lib/acts_as_revisable/acts/revision.rb', line 80

def grab_my_branches
  self.class.revisable_class.update_all(["revisable_branched_from_id = ?", self[:id]], ["revisable_branched_from_id = ?", self[:revisable_original_id]])
end

#next_revisionObject

Return the revision after this one.



54
55
56
# File 'lib/acts_as_revisable/acts/revision.rb', line 54

def next_revision
  self.class.find(:first, :conditions => {:revisable_original_id => revisable_original_id, :revisable_number => revisable_number + 1})
end

#previous_revisionObject

Return the revision prior to this one.



49
50
51
# File 'lib/acts_as_revisable/acts/revision.rb', line 49

def previous_revision
  self.class.find(:first, :conditions => {:revisable_original_id => revisable_original_id, :revisable_number => revisable_number - 1})
end

#reverting_fromObject



88
89
90
# File 'lib/acts_as_revisable/acts/revision.rb', line 88

def reverting_from
  from_revisable[:reverting_from]
end

#reverting_from=(val) ⇒ Object



92
93
94
# File 'lib/acts_as_revisable/acts/revision.rb', line 92

def reverting_from=(val)
  from_revisable[:reverting_from] = val
end

#reverting_toObject



96
97
98
# File 'lib/acts_as_revisable/acts/revision.rb', line 96

def reverting_to
  from_revisable[:reverting_to]
end

#reverting_to=(val) ⇒ Object



100
101
102
# File 'lib/acts_as_revisable/acts/revision.rb', line 100

def reverting_to=(val)
  from_revisable[:reverting_to] = val
end

#revision_nameObject

Accessor for revisable_name just to make external API more pleasant.



64
65
66
# File 'lib/acts_as_revisable/acts/revision.rb', line 64

def revision_name #:nodoc:
  self[:revisable_name]
end

#revision_name=(val) ⇒ Object

Setter for revisable_name just to make external API more pleasant.



59
60
61
# File 'lib/acts_as_revisable/acts/revision.rb', line 59

def revision_name=(val) #:nodoc:
  self[:revisable_name] = val
end

#revision_setupObject

Sets some initial values for a new revision.



69
70
71
72
73
74
75
76
77
78
# File 'lib/acts_as_revisable/acts/revision.rb', line 69

def revision_setup #:nodoc:
  now = Time.now
  prev = current_revision.revisions.first
  prev.update_attribute(:revisable_revised_at, now) if prev
  self[:revisable_current_at] = now + 1.second
  self[:revisable_is_current] = false
  self[:revisable_branched_from_id] = current_revision[:revisable_branched_from_id]
  self[:revisable_type] = current_revision[:type]
  self[:revisable_number] = (self.class.maximum(:revisable_number, :conditions => {:revisable_original_id => self[:revisable_original_id]}) || 0) + 1
end