module Prioritize::PriorityAfter::ClassMethods

Attributes

priority_column[RW]

Public Class Methods

extended(base) click to toggle source
# File lib/prioritize.rb, line 69
def self.extended base
  base.class_eval do
    @priority_column = :priority
  end
end

Public Instance Methods

priority_after(before_id, moved_id) click to toggle source
# File lib/prioritize.rb, line 24
      def priority_after before_id, moved_id
        connection.exec_query(
          <<-SQL,
            UPDATE #{table_name} o
            SET #{priority_column} = ordered.rn
            FROM (
              SELECT *, ROW_NUMBER() OVER() AS rn
              FROM (
                (
                  SELECT o.*
                  FROM #{table_name} o
                  LEFT JOIN #{table_name} ai ON ai.id = $1
                  WHERE
                    (o.#{priority_column} < ai.#{priority_column} OR ai.#{priority_column} IS NULL) AND
                    o.id <> $2
                  ORDER BY o.#{priority_column} ASC
                )
                UNION ALL
                (
                  SELECT o.*
                  FROM #{table_name} o
                  WHERE o.id = $2
                )
                UNION ALL
                (
                  SELECT o.*
                  FROM #{table_name} o
                  LEFT JOIN #{table_name} ai ON ai.id = $1
                  WHERE
                    o.#{priority_column} >= ai.#{priority_column} AND
                    o.id <> $2
                  ORDER BY o.#{priority_column} ASC
                )
              ) numbered
            ) ordered
            WHERE  o.id = ordered.id
          SQL
          'priority_after',
          [[nil,before_id], [nil,moved_id]]
        )
      end