Skip to content

Instantly share code, notes, and snippets.

@kivanio
Forked from bsylvain/rankable.rb
Created June 23, 2014 00:41
Show Gist options
  • Save kivanio/c0aef9aeda75385b084a to your computer and use it in GitHub Desktop.
Save kivanio/c0aef9aeda75385b084a to your computer and use it in GitHub Desktop.
require 'active_support/concern'
module Rankable
extend ActiveSupport::Concern
included do
validates :row_order, :presence => true
scope :next_rank, lambda { |rank| where('row_order > ?',rank).order("row_order asc").limit(1)}
scope :previous_rank, lambda { |rank| where('row_order < ?',rank).order("row_order desc").limit(1)}
scope :bigger_rank, order("row_order desc")
before_validation :assign_default_rank
end
def invert(target)
a = self.row_order
b = target.row_order
self.row_order = target.row_order
target.row_order = a
if self.save
if target.save
true
else
self.row_order = a
self.save
false
end
else
false
end
end
def increase_rank
return false unless self.class.next_rank(self.row_order).first &&
self.invert(self.class.next_rank(self.row_order).first)
end
def decrease_rank
return false unless self.class.previous_rank(self.row_order).first &&
self.invert(self.class.previous_rank(self.row_order).first)
end
private
def assign_default_rank
if !self.row_order
logger.debug "/////#{self.class.bigger_rank.first.inspect}\\\\\\/"
if self.class.bigger_rank.first
self.row_order = self.class.bigger_rank.first.row_order + 1
else
self.row_order=0
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment