lib/sequel/plugins/bitemporal.rb in sequel_bitemporal-0.1.8 vs lib/sequel/plugins/bitemporal.rb in sequel_bitemporal-0.1.9
- old
+ new
@@ -50,10 +50,15 @@
module DatasetMethods
end
module InstanceMethods
attr_reader :pending_version
+ def before_validation
+ prepare_pending_version
+ super
+ end
+
def validate
super
pending_version.errors.each do |key, key_errors|
key_errors.each{|error| errors.add key, error}
end if pending_version && !pending_version.valid?
@@ -80,29 +85,27 @@
attributes = current_attributes.merge attributes
end
attributes.delete :id
@pending_version ||= model.version_class.new
pending_version.set attributes
+ pending_version.master_id = id unless new?
end
def update_attributes(attributes={})
self.attributes = attributes
save raise_on_failure: false
end
def after_create
super
if pending_version
- prepare_pending_version
return false unless save_pending_version
end
end
def before_update
if pending_version
- lock!
- prepare_pending_version
expire_previous_versions
return false unless save_pending_version
end
super
end
@@ -132,23 +135,18 @@
end
private
def prepare_pending_version
+ return unless pending_version
point_in_time = Time.now
pending_version.created_at = point_in_time
pending_version.valid_from ||= point_in_time
end
- def save_pending_version
- pending_version.valid_to ||= Time.utc 9999
- success = add_version pending_version
- @pending_version = nil if success
- success
- end
-
def expire_previous_versions
+ lock!
expired = versions_dataset.where expired_at: nil
expired = expired.exclude "valid_from=valid_to"
expired = expired.exclude "valid_to<=?", pending_version.valid_from
pending_version.valid_to ||= expired.where("valid_from>?", pending_version.valid_from).min(:valid_from)
pending_version.valid_to ||= Time.utc 9999
@@ -160,9 +158,16 @@
elsif expired_version.valid_from<pending_version.valid_to && expired_version.valid_to>pending_version.valid_to
return false unless save_fossil expired_version, created_at: pending_version.created_at, valid_from: pending_version.valid_to
end
end
versions_dataset.where(id: expired.collect(&:id)).update expired_at: pending_version.created_at
+ end
+
+ def save_pending_version
+ pending_version.valid_to ||= Time.utc 9999
+ success = add_version pending_version
+ @pending_version = nil if success
+ success
end
def save_fossil(expired, attributes={})
fossil = model.version_class.new
expired_attributes = expired.values.dup
\ No newline at end of file