Skip to content

Instantly share code, notes, and snippets.

@umairabid
Created October 21, 2023 22:54
Show Gist options
  • Save umairabid/54ca1f6ab7a32439554551418847ced5 to your computer and use it in GitHub Desktop.
Save umairabid/54ca1f6ab7a32439554551418847ced5 to your computer and use it in GitHub Desktop.
blog/traveling-time-with-postgres-range-columns/
class StateTax < ApplicationRecord
attr_accessor :effective_date
def save_temporal
StateTax.transaction do
raise ArgumentError, 'Effective date is not set' unless effective_date.present?
raise ArgumentError, 'Cannot save temporal an existing record' if persisted?
now = Time.zone.now
new_row = self.class.new(state_id: state_id, tax_type: tax_type, rate: rate)
new_row.effective_range = effective_date...nil
new_row.system_range = now...nil
if previous_row.present?
previous_row.system_range = previous_row.system_range.first...now
previous_row.save!
puts new_row.effective_range.first
puts previous_row.effective_range.first
if new_row.effective_range.first > previous_row.effective_range.first
new_previous_row = previous_row.dup
new_previous_row.effective_range = new_previous_row.effective_range.first...new_row.effective_range.first
new_previous_row.system_range = now...nil
new_previous_row.save!
end
end
if next_row.present?
new_row.effective_range = new_row.effective_range.first...next_row.effective_range.first
end
new_row.save!
end
end
def previous_row
@previous_row ||= base_query.where('lower(effective_range) <= ?', effective_date).order('lower(effective_range) desc').limit(1).first
end
def next_row
@next_row ||= base_query.where('lower(effective_range) > ?', effective_date).order('lower(effective_range) asc').limit(1).first
end
def base_query
StateTax.where(state_id: state_id, tax_type: tax_type).where('upper(system_range) is null')
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment