From ed46cc3058ac9406f61220c9720c51f4edd172f9 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 17 Apr 2005 06:50:17 +0000 Subject: Added insert_at(position) to acts_as_list #1083 [DeLynnB] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1179 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activerecord/lib/active_record/acts/list.rb | 32 +++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) (limited to 'activerecord/lib') diff --git a/activerecord/lib/active_record/acts/list.rb b/activerecord/lib/active_record/acts/list.rb index abd295d4e9..4d649726b2 100644 --- a/activerecord/lib/active_record/acts/list.rb +++ b/activerecord/lib/active_record/acts/list.rb @@ -71,6 +71,10 @@ module ActiveRecord # lower in the list of all chapters. Likewise, chapter.first? would return true if that chapter is # the first in the list of all chapters. module InstanceMethods + def insert_at(position = 1) + position == 1 ? add_to_list_top : insert_at_position(position) + end + def move_lower return unless lower_item @@ -107,7 +111,6 @@ module ActiveRecord decrement_positions_on_lower_items end - def increment_position update_attribute position_column, self.send(position_column).to_i + 1 end @@ -168,24 +171,45 @@ module ActiveRecord update_attribute(position_column, 1) end + # This has the effect of moving all the higher items up one. + def decrement_positions_on_higher_items(position) + self.class.update_all( + "#{position_column} = (#{position_column} - 1)", "#{scope_condition} AND #{position_column} <= #{position}" + ) + end + # This has the effect of moving all the lower items up one. def decrement_positions_on_lower_items self.class.update_all( - "#{position_column} = (#{position_column} - 1)", "#{scope_condition} AND #{position_column} > #{send(position_column).to_i}" + "#{position_column} = (#{position_column} - 1)", "#{scope_condition} AND #{position_column} > #{send(position_column).to_i}" ) end - + + # This has the effect of moving all the higher items down one. def increment_positions_on_higher_items self.class.update_all( - "#{position_column} = (#{position_column} + 1)", "#{scope_condition} AND #{position_column} < #{send(position_column).to_i}" + "#{position_column} = (#{position_column} + 1)", "#{scope_condition} AND #{position_column} < #{send(position_column).to_i}" ) end + # This has the effect of moving all the lower items down one. + def increment_positions_on_lower_items(position) + self.class.update_all( + "#{position_column} = (#{position_column} + 1)", "#{scope_condition} AND #{position_column} >= #{position}" + ) + end + def increment_positions_on_all_items self.class.update_all( "#{position_column} = (#{position_column} + 1)", "#{scope_condition}" ) end + + def insert_at_position(position) + remove_from_list + increment_positions_on_lower_items(position) + self.update_attribute(position_column, position) + end end end end -- cgit v1.2.3