Sha256: 17faa644e433a1f27302580e40419ba1cf065c7af90f8227adfc95145224fddb

Contents?: true

Size: 1.76 KB

Versions: 16

Compression:

Stored size: 1.76 KB

Contents

module Qbrick
  # If you use this mixin, your class must implement the following methods
  # siblings(), returns the siblings of the same type of object

  module Orderable
    def self.included(base)
      base.extend(ClassMethods)
      base.send :include, InstanceMethods
      base.after_create :set_position
    end

    module InstanceMethods
      def increment_position
        update_attribute :position, position + 1
      end

      def decrement_position
        update_attribute :position, position - 1
      end

      def preceding_sibling
        siblings.where('position = ?', position - 1).first
      end

      def succeeding_sibling
        siblings.where('position = ?', position + 1).first
      end

      def preceding_siblings
        siblings.where('position <= ?', position).where('id != ?', id)
      end

      def succeeding_siblings
        siblings.where('position >= ?', position).where('id != ?', id)
      end

      def position_to_top
        update_attribute :position, 1
        recount_siblings_position_from 1
      end

      def recount_siblings_position_from(position)
        counter = position
        succeeding_siblings.each do |s|
          counter += 1
          s.update_attribute(:position, counter)
        end
      end

      def reposition(before_id)
        if before_id.blank?
          position_to_top
        else
          update_attribute :position, self.class.position_of(before_id) + 1
          recount_siblings_position_from position
        end
      end

      def set_position
        initial_position = siblings.blank? ? 1 : siblings.count + 1
        update_attribute(:position, initial_position)
      end
    end

    module ClassMethods
      def position_of(id)
        find(id).position rescue 1
      end
    end
  end
end

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
qbrick-2.7.1 lib/qbrick/orderable.rb
qbrick-2.7 lib/qbrick/orderable.rb
qbrick-2.6.10 lib/qbrick/orderable.rb
qbrick-2.6.9 lib/qbrick/orderable.rb
qbrick-2.6.8 lib/qbrick/orderable.rb
qbrick-2.6.7 lib/qbrick/orderable.rb
qbrick-2.6.6 lib/qbrick/orderable.rb
qbrick-2.6.5 lib/qbrick/orderable.rb
qbrick-2.6.4 lib/qbrick/orderable.rb
qbrick-2.6.3 lib/qbrick/orderable.rb
qbrick-2.6.2 lib/qbrick/orderable.rb
qbrick-2.6.1 lib/qbrick/orderable.rb
qbrick-2.6.0 lib/qbrick/orderable.rb
qbrick-2.5.2 lib/qbrick/orderable.rb
qbrick-2.5.1 lib/qbrick/orderable.rb
qbrick-2.5.0 lib/qbrick/orderable.rb