14 lines
No EOL
588 B
Ruby
14 lines
No EOL
588 B
Ruby
class SortableList < Array
|
|
def reorder_list(positions)
|
|
list = self
|
|
changed = {}
|
|
positions.collect!(&:to_i).each_with_index do |new_position, old_position|
|
|
if new_position != 0 && new_position <= list.length && !changed.has_key?(new_position)
|
|
changed.merge!({new_position => list[old_position]})
|
|
end
|
|
end
|
|
list -= changed.values
|
|
changed.sort.each {|pair| pair.first > list.length ? list << pair.last : list.insert(pair.first-1, pair.last)}
|
|
list.each_with_index {|list_item, index| list_item.update_attribute(:position, index + 1)}
|
|
end
|
|
end |