diff --git a/lib/positioning.rb b/lib/positioning.rb index 638de7d..fa9d5dc 100644 --- a/lib/positioning.rb +++ b/lib/positioning.rb @@ -18,7 +18,7 @@ def positioning_columns @positioning_columns ||= {} end - def positioned(on: [], column: :position) + def positioned(on: [], column: :position, touch: false) unless base_class? raise Error.new "can't be called on an abstract class or STI subclass." end @@ -43,17 +43,17 @@ def positioned(on: [], column: :position) end end - define_method(:"prior_#{column}") { Mechanisms.new(self, column).prior } - define_method(:"subsequent_#{column}") { Mechanisms.new(self, column).subsequent } + define_method(:"prior_#{column}") { Mechanisms.new(self, column, touch).prior } + define_method(:"subsequent_#{column}") { Mechanisms.new(self, column, touch).subsequent } redefine_method(:"#{column}=") do |position| send :"#{column}_will_change!" super(position) end - before_create { Mechanisms.new(self, column).create_position } - before_update { Mechanisms.new(self, column).update_position } - before_destroy { Mechanisms.new(self, column).destroy_position } + before_create { Mechanisms.new(self, column, touch).create_position } + before_update { Mechanisms.new(self, column, touch).update_position } + before_destroy { Mechanisms.new(self, column, touch).destroy_position } define_singleton_method(:"heal_#{column}_column!") do |order = column| Healer.new(self, column, order).heal diff --git a/lib/positioning/mechanisms.rb b/lib/positioning/mechanisms.rb index d6bfa69..85fd907 100644 --- a/lib/positioning/mechanisms.rb +++ b/lib/positioning/mechanisms.rb @@ -1,8 +1,9 @@ module Positioning class Mechanisms - def initialize(positioned, column) + def initialize(positioned, column, touch) @positioned = positioned @column = column.to_sym + @touch = touch end def prior @@ -106,13 +107,21 @@ def move_out_of_the_way end def expand(scope, range) - scope.where(@column => range).update_all "#{quoted_column} = #{quoted_column} * -1" + records = scope.where(@column => range) + records.update_all "#{quoted_column} = #{quoted_column} * -1" scope.where(@column => ..-1).update_all "#{quoted_column} = #{quoted_column} * -1 + 1" + if @touch + records.find_each { it.touch } + end end def contract(scope, range) - scope.where(@column => range).update_all "#{quoted_column} = #{quoted_column} * -1" + records = scope.where(@column => range) + records.update_all "#{quoted_column} = #{quoted_column} * -1" scope.where(@column => ..-1).update_all "#{quoted_column} = #{quoted_column} * -1 - 1" + if @touch + records.find_each { it.touch } + end end def solidify_position