Skip to content

Instantly share code, notes, and snippets.

@lazaronixon
Created April 22, 2025 13:36
Show Gist options
  • Save lazaronixon/1b608aefbbc3a1b0b939839d73076f6d to your computer and use it in GitHub Desktop.
Save lazaronixon/1b608aefbbc3a1b0b939839d73076f6d to your computer and use it in GitHub Desktop.
positionable.rb
module Element::Positionable
extend ActiveSupport::Concern
included do
before_create :set_position
before_update :reposition_before_update
validates_numericality_of :position, greater_than_or_equal_to: 1, on: :update
end
private
def set_position
self.position = parent.elements.maximum(:position).to_i + 1
end
def reposition_before_update
move_elements_down_chain if position < position_was
move_elements_up_chain if position > position_was
end
def move_elements_down_chain
parent.elements.where('position BETWEEN ? AND ?', position, position_was - 1).update_all('position = position + 1')
end
def move_elements_up_chain
parent.elements.where('position BETWEEN ? AND ?', position_was + 1, position).update_all('position = position - 1')
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment