Sha256: 48cb409ac813fb565450965d2a1553475c1a2df1c98646cfac5daa037a0cd1a7

Contents?: true

Size: 1.24 KB

Versions: 2

Compression:

Stored size: 1.24 KB

Contents

require "much-plugin"

module Ardb
  module DefaultOrderBy
    include MuchPlugin

    DEFAULT_ATTRIBUTE  = :order_by
    DEFAULT_SCOPE_PROC = proc{ self.class.scoped }

    plugin_included do
      @ardb_default_order_by_config = {}
    end

    plugin_class_methods do
      def default_order_by(options = nil)
        options ||= {}

        @ardb_default_order_by_config.merge!({
          :attribute  => options[:attribute] || DEFAULT_ATTRIBUTE,
          :scope_proc => options[:scope]     || DEFAULT_SCOPE_PROC
        })

        before_validation :ardb_default_order_by, :on => :create
      end

      def ardb_default_order_by_config
        @ardb_default_order_by_config
      end
    end

    plugin_instance_methods do
      private

      def reset_order_by
        attr_name  = self.class.ardb_default_order_by_config[:attribute]
        scope_proc = self.class.ardb_default_order_by_config[:scope_proc]

        current_max = self.instance_eval(&scope_proc).maximum(attr_name) || 0
        self.send("#{attr_name}=", current_max + 1)
      end

      def ardb_default_order_by
        attr_name = self.class.ardb_default_order_by_config[:attribute]
        reset_order_by if self.send(attr_name).to_s.empty?
        true
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
ardb-0.29.1 lib/ardb/default_order_by.rb
ardb-0.29.0 lib/ardb/default_order_by.rb