discourse/app/models/concerns/positionable.rb
Ted Johansson 25ccf6fab1
FIX: Update position on model when re-positioning record (#24997)
When updating the position of a category, the server correctly updates the position in the database, but the response sent back to the client still contains the old position, causing it to "flip back" in the UI when saving. Only reloading the page will reveal the new, correct value.

The Positionable concern correctly positions the record and updates the database, but we don't assign the new position to the already instantiated model.

This change just assigns self.position after the database update. 😎
2023-12-21 10:15:10 +08:00

40 lines
1.1 KiB
Ruby

# frozen_string_literal: true
module Positionable
extend ActiveSupport::Concern
included { before_save { self.position ||= self.class.count } }
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
self.position = position
end
end