class Admission < ApplicationRecord belongs_to :country, inverse_of: :admissions belongs_to :person, inverse_of: :admissions belongs_to :previous, class_name: name, inverse_of: :next, optional: true has_one :next, class_name: name, foreign_key: :previous_id, inverse_of: :previous scope :ordered, -> { order(:arrived_on, :previous_id) } scope :before, -> (date) { where("#{table_name}.arrived_on <= ?", date) } scope :after, -> (date) { where("#{table_name}.arrived_on >= ?", date) } around_create :set_previous before_destroy :update_nexts_previous def set_previous self.previous ||= person.admissions.ordered.before(arrived_on).last future_next = previous&.reload_next yield future_next&.update(previous: self) end def update_nexts_previous self.next&.update(previous: previous) end end