1
0
Fork 0
mirror of https://github.com/paper-trail-gem/paper_trail.git synced 2022-11-09 11:33:19 -05:00
paper-trail-gem--paper_trail/lib/paper_trail/version.rb

60 lines
1.7 KiB
Ruby
Raw Normal View History

2009-05-27 11:21:20 -04:00
class Version < ActiveRecord::Base
belongs_to :item, :polymorphic => true
validates_presence_of :event
def reify
unless object.nil?
# Attributes
attrs = YAML::load object
# Normally a polymorphic belongs_to relationship allows us
# to get the object we belong to by calling, in this case,
# +item+. However this returns nil if +item+ has been
# destroyed, and we need to be able to retrieve destroyed
# objects.
#
# In this situation we constantize the +item_type+ to get hold of
# the class...except when the stored object's attributes
# include a +type+ key. If this is the case, the object
# we belong to is using single table inheritance and the
# +item_type+ will be the base class, not the actual subclass.
# If +type+ is present but empty, the class is the base class.
if item
model = item
else
class_name = attrs['type'].blank? ? item_type : attrs['type']
klass = class_name.constantize
model = klass.new
end
attrs.each do |k, v|
2009-05-27 11:21:20 -04:00
begin
model.send "#{k}=", v
rescue NoMethodError
2009-11-19 22:15:30 -05:00
logger.warn "Attribute #{k} does not exist on #{item_type} (Version id: #{id})."
2009-05-27 11:21:20 -04:00
end
end
2009-05-27 11:21:20 -04:00
model
end
end
2009-06-19 05:15:49 -04:00
2009-06-19 11:46:33 -04:00
def next
Version.first :conditions => ["id > ? AND item_type = ? AND item_id = ?", id, item_type, item_id],
:order => 'id ASC'
end
def previous
Version.first :conditions => ["id < ? AND item_type = ? AND item_id = ?", id, item_type, item_id],
:order => 'id DESC'
end
2009-06-22 11:37:00 -04:00
def index
Version.all(:conditions => ["item_type = ? AND item_id = ?", item_type, item_id],
:order => 'id ASC').index(self)
end
2009-05-27 11:21:20 -04:00
end