module ActiveRecord::Orderable::InstanceMethods
Public Instance Methods
all_orderable()
click to toggle source
returns all elements in current scope
# File lib/ar-orderable.rb, line 77 def all_orderable if self.class.orderable_scope.any? scope = self.class.orderable_scope.inject({}) do |where, scope_name| where[scope_name] = self[scope_name] where end self.class.where(scope) else self.class.scoped end end
move_down(options = {})
click to toggle source
# File lib/ar-orderable.rb, line 72 def move_down options = {} move_to(self[self.class.orderable_column] + 1, options) if self[self.class.orderable_column] end
move_to(nr, options = {})
click to toggle source
Moves Item to given position
# File lib/ar-orderable.rb, line 58 def move_to nr, options = {} if options[:skip_callbacks].nil? ? self.class.skip_callbacks_for_orderable : options[:skip_callbacks] self[self.class.orderable_column] = nr self.send(:pre_save_ordering) self.class.raw_orderable_update(self.id, nr) else self.update_attribute(self.class.orderable_column, nr) end end
move_up(options = {})
click to toggle source
# File lib/ar-orderable.rb, line 68 def move_up options = {} move_to(self[self.class.orderable_column] - 1, options) if self[self.class.orderable_column] end
Private Instance Methods
pre_destroy_ordering()
click to toggle source
# File lib/ar-orderable.rb, line 131 def pre_destroy_ordering self.all_orderable.each do |item| if item[self.class.orderable_column].to_i > self[self.class.orderable_column].to_i item[self.class.orderable_column] -= 1 self.class.raw_orderable_update(item.id, item[self.class.orderable_column]) end end end
pre_save_ordering()
click to toggle source
# File lib/ar-orderable.rb, line 91 def pre_save_ordering column_name = self.class.orderable_column self[column_name] = 0 if self[column_name].nil? if self.id if self[column_name] == 0 self[column_name] = 1 end if self[column_name] > self.all_orderable.count self[column_name] = self[column_name] -1 end else self[column_name] = self.all_orderable.count + 1 if self[column_name].to_i == 0 end return unless self.all_orderable.where("id != ? and #{column_name} = ?", self.id, self[column_name]).count > 0 self.all_orderable.where("#{self.class.table_name}.id != ?",self.id || 0).find_each do |item| item[column_name] = 0 if item[column_name].nil? if self.id if item[column_name] > (self.send("#{column_name}_was") || 0 ) if item[column_name] <= self[column_name] item[column_name] -= 1 end else if item[column_name] >= self[column_name] item[column_name] += 1 end end if item[column_name] != item.send("#{column_name}_was") self.class.raw_orderable_update(item.id, item[column_name]) end else if item[column_name] >= self[column_name] item[column_name] += 1 self.class.raw_orderable_update(item.id, item[column_name]) end end end end