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