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