10
11
12
13
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
# File 'lib/vestal_versions.rb', line 10
def versioned options = {}
cattr_accessor :versioned_columns
if options[:only]
self.versioned_columns = Array(options[:only]).map( &:to_s )
elsif options[:except]
self.versioned_columns = column_names - Array(options[:except]).map( &:to_s )
else
self.versioned_columns = column_names
end
has_many :versions, :as => :versioned, :order => 'versions.number ASC', :dependent => :delete_all do
def between(from, to)
from_number, to_number = number_at(from), number_at(to)
return [] if from_number.nil? || to_number.nil?
condition = (from_number == to_number) ? to_number : Range.new(*[from_number, to_number].sort)
all(
:conditions => {:number => condition},
:order => "versions.number #{(from_number > to_number) ? 'DESC' : 'ASC'}"
)
end
def at(value)
case value
when Version then value
when Numeric then find_by_number(value.floor)
when Symbol then respond_to?(value) ? send(value) : nil
when Date, Time then last(:conditions => ['versions.created_at <= ?', value.to_time])
end
end
def number_at(value)
case value
when Version then value.number
when Numeric then value.floor
when Symbol, Date, Time then at(value).try(:number)
end
end
end
after_create :create_initial_version
after_update :create_initial_version, :if => :needs_initial_version?
after_update :create_version, :if => :needs_version?
include InstanceMethods
alias_method_chain :reload, :versions
end
|