Module: Glue::Revisable

Defined in:
lib/glue/revisable.rb

Overview

Revision support for Og-managed classes.

class Article

is Revisable
property :body, String, :revisable => true
property :title, String

end

Generates the Revision class:

class Article::Revision

article.revisions

article.revise do |a|

a.title = 'hello'
a.body = 'world'

end

article.rollback(4)

Defined Under Namespace

Modules: Mixin

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/glue/revisable.rb', line 65

def self.included(base)
  super
  
  base.module_eval %{
    class Revision < #{base}
      include Revisable::Mixin
      belongs_to #{base}
    end
  }
  
  base.has_many :revisions, base::Revision
end

Instance Method Details

#get_revision(rev) ⇒ Object

Return a revision.



101
102
103
104
# File 'lib/glue/revisable.rb', line 101

def get_revision(rev)
  return self if rev.to_i == self.revision
  self.revisions.find_one(:condition => "revision=#{rev}")
end

#last_revisionObject

Return the last revision.



108
109
110
# File 'lib/glue/revisable.rb', line 108

def last_revision
  self.revisions(:order => 'revision DESC', :limit => 1).first
end

#revise(options = {}) {|_self| ... } ⇒ Object Also known as: revise!

Can accept options like owner or a comment. You can specialize this in your app.

Yields:

  • (_self)

Yield Parameters:



81
82
83
84
85
86
87
88
89
90
# File 'lib/glue/revisable.rb', line 81

def revise(options = {})
  if self.revision.nil? 
    self.revision = 1 
  else
    self.revision += 1
  end
  self.revisions << self.class::Revision.new(self, options)
  yield(self) if block_given?
  self.save
end

#revision_countObject Also known as: revisions_count

The number of revisions.



114
115
116
# File 'lib/glue/revisable.rb', line 114

def revision_count
  self.revisions.count
end

#rollback(rev, options = {}) ⇒ Object

Rollback to an older revision.



95
96
97
# File 'lib/glue/revisable.rb', line 95

def rollback(rev, options = {})
  self.revise(options) { |obj| get_revision(rev).apply_to(obj) }
end