Module: PeriodicRecords::Model

Extended by:
ActiveSupport::Concern
Defined in:
lib/periodic_records/model.rb

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

MIN =
Date.new(0001, 1, 1)
MAX =
Date.new(9999, 1, 1)

Instance Method Summary collapse

Instance Method Details

#adjust_overlapping_recordsObject



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/periodic_records/model.rb', line 55

def adjust_overlapping_records
  overlapping_records.each do |overlapping_record|
    if overlapping_record.start_at >= start_at &&
         overlapping_record.end_at <= end_at
      destroy_overlapping_record(overlapping_record)
    elsif overlapping_record.start_at < start_at &&
            overlapping_record.end_at > end_at
      split_overlapping_record(overlapping_record)
    elsif overlapping_record.start_at < start_at
      adjust_overlapping_record_end_at(overlapping_record)
    elsif overlapping_record.end_at > end_at
      adjust_overlapping_record_start_at(overlapping_record)
    end
  end
end

#current?Boolean

Returns:

  • (Boolean)


38
39
40
41
# File 'lib/periodic_records/model.rb', line 38

def current?
  date = Date.current
  within_interval?(date, date)
end

#overlapping_recordsObject



51
52
53
# File 'lib/periodic_records/model.rb', line 51

def overlapping_records
  siblings.within_interval(start_at, end_at)
end

#periodic_dupObject



75
76
77
# File 'lib/periodic_records/model.rb', line 75

def periodic_dup
  dup
end

#record_split_stepObject



79
80
81
82
83
84
85
86
87
88
89
# File 'lib/periodic_records/model.rb', line 79

def record_split_step
  @record_split_step ||= begin
    column = self.class.column_for_attribute(:start_at)
    if column.type == :datetime
       precision = column.precision || 6
       Float("1.0e-#{precision}").seconds
    else
      1.day
    end
  end
end

#set_default_period_after_initialize?Boolean

Returns:

  • (Boolean)


71
72
73
# File 'lib/periodic_records/model.rb', line 71

def set_default_period_after_initialize?
  new_record?
end

#siblingsObject

Raises:

  • (NotImplementedError)


47
48
49
# File 'lib/periodic_records/model.rb', line 47

def siblings
  raise NotImplementedError
end

#within_interval?(start_date, end_date) ⇒ Boolean

Returns:

  • (Boolean)


43
44
45
# File 'lib/periodic_records/model.rb', line 43

def within_interval?(start_date, end_date)
  start_at && end_at && start_at <= end_date && end_at >= start_date
end