lib/sequel/plugins/bitemporal.rb in sequel_bitemporal-0.2.0 vs lib/sequel/plugins/bitemporal.rb in sequel_bitemporal-0.3.0

- old
+ new

@@ -29,23 +29,27 @@ version = opts[:version_class] raise Error, "please specify version class to use for bitemporal plugin" unless version required = [:master_id, :valid_from, :valid_to, :created_at, :expired_at] missing = required - version.columns raise Error, "bitemporal plugin requires the following missing column#{"s" if missing.size>1} on version class: #{missing.join(", ")}" unless missing.empty? + master.instance_eval do + @version_class = version + @current_version_name = "#{name ? underscore(demodulize(name)) : table_name}_current_version".to_sym + end master.one_to_many :versions, class: version, key: :master_id - master.one_to_one :current_version, class: version, key: :master_id, :graph_block=>(proc do |j, lj, js| + master.one_to_one master.current_version_name, class: version, key: :master_id, :graph_block=>(proc do |j, lj, js| t = ::Sequel::Plugins::Bitemporal.point_in_time n = ::Sequel::Plugins::Bitemporal.now e = :expired_at.qualify(j) (:created_at.qualify(j) <= t) & ({e=>nil} | (e > t)) & (:valid_from.qualify(j) <= n) & (:valid_to.qualify(j) > n) end) do |ds| t = ::Sequel::Plugins::Bitemporal.point_in_time n = ::Sequel::Plugins::Bitemporal.now ds.where{(created_at <= t) & ({expired_at=>nil} | (expired_at > t)) & (valid_from <= n) & (valid_to > n)} end master.def_dataset_method :with_current_version do - eager_graph(:current_version).where({current_version__id: nil}.sql_negate) + eager_graph(model.current_version_name).where({:id.qualify(model.current_version_name) => nil}.sql_negate) end master.one_to_many :current_or_future_versions, class: version, key: :master_id, :graph_block=>(proc do |j, lj, js| t = ::Sequel::Plugins::Bitemporal.point_in_time n = ::Sequel::Plugins::Bitemporal.now e = :expired_at.qualify(j) @@ -71,13 +75,10 @@ end def destroy master.destroy_version self end end - master.instance_eval do - @version_class = version - end unless opts[:delegate]==false (version.columns-required-[:id]).each do |column| master.class_eval <<-EOS def #{column} pending_or_current_version.#{column} if pending_or_current_version @@ -85,11 +86,11 @@ EOS end end end module ClassMethods - attr_reader :version_class + attr_reader :version_class, :current_version_name end module DatasetMethods end module InstanceMethods attr_reader :pending_version @@ -102,9 +103,13 @@ 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? + end + + def current_version(*args) + send(self.class.current_version_name, *args) end def pending_or_current_version pending_version || current_version end