discourse/app/models/concerns/positionable.rb
Sam Saffron 30990006a9 DEV: enable frozen string literal on all files
This reduces chances of errors where consumers of strings mutate inputs
and reduces memory usage of the app.

Test suite passes now, but there may be some stuff left, so we will run
a few sites on a branch prior to merging
2019-05-13 09:31:32 +08:00

39 lines
1010 B
Ruby

# frozen_string_literal: true
module Positionable
extend ActiveSupport::Concern
included do
before_save do
self.position ||= self.class.count
end
end
def move_to(position_arg)
position = [[position_arg, 0].max, self.class.count - 1].min
if self.position.nil? || position > (self.position)
DB.exec "
UPDATE #{self.class.table_name}
SET position = position - 1
WHERE position > :current_position and position <= :new_position",
current_position: self.position, new_position: position
elsif position < self.position
DB.exec "
UPDATE #{self.class.table_name}
SET position = position + 1
WHERE position >= :new_position and position < :current_position",
current_position: self.position, new_position: position
else
# Not moving to a new position
return
end
DB.exec "
UPDATE #{self.class.table_name}
SET position = :position
WHERE id = :id", id: id, position: position
end
end