Sha256: ff6ab74b6823430a2335009fed1b472a2a15858ef73f6e317f6a07bfcc9d2e50

Contents?: true

Size: 1.34 KB

Versions: 1

Compression:

Stored size: 1.34 KB

Contents

require_relative "positioning/version"
require_relative "positioning/mechanisms"

require "active_support/concern"
require "active_support/lazy_load_hooks"

module Positioning
  class Error < StandardError; end

  extend ActiveSupport::Concern

  class_methods do
    def positioning_columns
      @positioning_columns ||= {}
    end

    def positioned(on: [], column: :position)
      column = column.to_sym

      if positioning_columns.key? column
        raise Error.new "The column `#{column}` has already been used by the scope `#{positioning_columns[column]}`."
      else
        positioning_columns[column] = Array.wrap(on).map do |scope_component|
          scope_component = scope_component.to_s
          reflection = reflections[scope_component]

          (reflection && reflection.belongs_to?) ? reflection.foreign_key : scope_component
        end

        define_method(:"prior_#{column}") { Mechanisms.new(self, column).prior }
        define_method(:"subsequent_#{column}") { Mechanisms.new(self, column).subsequent }

        before_create { Mechanisms.new(self, column).create_position }
        before_update { Mechanisms.new(self, column).update_position }
        after_destroy { Mechanisms.new(self, column).destroy_position }
      end
    end
  end
end

ActiveSupport.on_load :active_record do
  ActiveRecord::Base.send :include, Positioning
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
positioning-0.1.0 lib/positioning.rb