Created
October 21, 2023 22:54
-
-
Save umairabid/54ca1f6ab7a32439554551418847ced5 to your computer and use it in GitHub Desktop.
blog/traveling-time-with-postgres-range-columns/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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