Sha256: 6fb89c0645b77a6e833df4e9ab64a355ed37e148cbef44b0f358aaa7b5239590

Contents?: true

Size: 1.52 KB

Versions: 1

Compression:

Stored size: 1.52 KB

Contents

module RailsSortable

  #
  # Include this module to your ActiveRecord model.
  # And you must call `set_sortable` method for using sortable model.
  #
  # ex)
  # class SampleModel < ActiveRecord::Base
  #   include RailsSortable::Model
  #   set_sortable :sort, silence_recording_timestamps: true
  # end
  #
  module Model
    def self.included(base)
      base.class_eval do
        before_create :maximize_sort
      end
      base.extend ClassMethods
    end

    def update_sort!(new_value)
      write_attribute sort_attribute, new_value
      if sortable_options[:silence_recording_timestamps]
        silence_recording_timestamps { save! }
      else
        save!
      end
    end

  protected

    def maximize_sort
      return if read_attribute(sort_attribute)
      write_attribute sort_attribute, max_sort
    end

    def silence_recording_timestamps
      raise ArgumentError unless block_given?
      original_record_timestamps = self.class.record_timestamps
      self.class.record_timestamps = false
      yield
      self.class.record_timestamps = original_record_timestamps
    end

    def max_sort
      (self.class.maximum(sort_attribute) || 0) + 1
    end

    module ClassMethods
      #
      # allowed options
      # - silence_recording_timestamps
      #     When it is true, timestamp(updated_at) will be NOT modified with reordering.
      #
      def set_sortable(attribute, options = {})
        define_method("sort_attribute") { attribute }
        define_method("sortable_options") { options }
      end
    end
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rails_sortable-0.0.4 app/models/rails_sortable/model.rb