module Reprioritizable
Constants
- VERSION
Public Instance Methods
decrease_priority(column)
click to toggle source
# File lib/reprioritizable.rb, line 44 def decrease_priority(column) eval("self.#{column} -= 1") end
increase_priority(column)
click to toggle source
# File lib/reprioritizable.rb, line 40 def increase_priority(column) eval("self.#{column} += 1") end
reprioritize(scope) { |prioritable| ... }
click to toggle source
# File lib/reprioritizable.rb, line 30 def reprioritize(scope, &_block) attributes = scope.map do |prioritable| yield(prioritable) prioritable.updated_at = Time.zone.now prioritable.attributes end scope.klass.upsert_all(attributes) if attributes.any? end
reprioritize!(column:, scope:, instance:, new_priority:)
click to toggle source
# File lib/reprioritizable.rb, line 8 def reprioritize!(column:, scope:, instance:, new_priority:) instance.restrict_max_priority!(column, new_priority, scope) instance.restrict_minimum_priority!(column, new_priority, scope) before_priority = instance.send(column) if before_priority > new_priority reprioritize( scope.where("#{column} >= ?", new_priority).where("#{column} < ?", before_priority) ) do |record| record.increase_priority(column) end elsif before_priority < new_priority reprioritize( scope.where("#{column} <= ?", new_priority).where("#{column} > ?", before_priority) ) do |record| record.decrease_priority(column) end end instance.update!("#{column}": new_priority) end
restrict_max_priority!(column, new_priority, scope)
click to toggle source
# File lib/reprioritizable.rb, line 48 def restrict_max_priority!(column, new_priority, scope) max_size = scope.maximum(column) errors.add(:base, "Please register with a value of #{max_size} or less.") if max_size < new_priority raise ActiveRecord::RecordInvalid, self if errors.any? end
restrict_minimum_priority!(column, new_priority, scope)
click to toggle source
# File lib/reprioritizable.rb, line 55 def restrict_minimum_priority!(column, new_priority, scope) minimum_size = scope.minimum(column) errors.add(:base, "Please register with a value of #{minimum_size} or more.") if minimum_size > new_priority raise ActiveRecord::RecordInvalid, self if errors.any? end