Skip to content

Instantly share code, notes, and snippets.

@probablykabari
Created October 1, 2012 16:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save probablykabari/3812713 to your computer and use it in GitHub Desktop.
Save probablykabari/3812713 to your computer and use it in GitHub Desktop.
Mongomapper sortable list
# Allow for sortable lists in mongomapper
# fairly application specific but just to show an example...
module MongoMapper; module Plugins
module SortableQuestion
extend ActiveSupport::Concern
included do
key :position, Integer, :default => 1
before_create :append_to_bottom_of_list
after_destroy :set_lower_sibling_positions
end
module ClassMethods
def reorder_pages(*pages)
pages.each_with_index do |ids, index|
set(*ids, {:page_number => index + 1})
end
end
def reorder(*ids, page_number)
ids.map! {|id| id.to_s } # ensure entities are strings
ids.each_with_index do |id, index|
set(id, {:position => index + 1, :page_number => page_number})
end
end
end
def previous
self.survey.questions.first(:position => position - 1, :page_number => page_number)
end
def next
self.survey.questions.first(:position => position + 1, :page_number => page_number)
end
# @todo
def set_position(index, options = {})
end
def siblings
self.survey.questions.all(:page_number => self.page_number, :position.ne => self.position)
end
private
def append_to_bottom_of_list
self.position = self.survey.questions.all(:page_number => self.page_number).count + 1
end
def set_lower_sibling_positions
Question.decrement({:survey_id => self.survey_id, :position.gt => self.position, :page_number => self.page_number}, {:position => 1})
end
end
end; end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment