# Mongoid Acts as list
This is a port of the classic +acts_as_list+ to Mongoid.
This *acts_as* extension provides the capabilities for sorting and reordering a number of objects in a list.
If you do not specify custom position +column+ in the options, a key named +pos+ will be used automatically.
## Installation
gem install acts_as_list_mongoid
## Usage
See the /specs folder specs that demontrate the API. Usage examples are located in the /examples folder.
## Update 26, Nov 2010
The gem doesn't seem to work with the latest versions of Mongoid (> beta14), please help fix this ;)
Usage has been simplified using a suggestion by 'KieranP'
To make a class Act as List, simply do:
include ActsAsList::MongoidAnd it will automatically set up a field and call acts_as_list with that field. By default the field name is :position. You can change the defaut position_column name used:
ActsAsList::Mongoid.default_position_column = :pos
.
For this class variable to be effetive, it should be set before calling include ActsAsList::Mongoid
.
## Example
require 'mongoid' require 'mongoid_embedded_helper' Mongoid.configure.master = Mongo::Connection.new.db('acts_as_list-test') class Item include Mongoid::Document include Mongoid::Timestamps include ActsAsList::Mongoid field :number, :type => Integer embedded_in :list, :inverse_of => :items end class List include Mongoid::Document field :name, :type => String embeds_many :items end todo_list = List.new :name => 'My todo list' %w{'clean', 'wash', 'repair'}.each do |name| todo_item = Item.new(:name => name) todo_list.items << todo_item end todo_list.items.init_list! # IMPORTANT!!! todo_list.items.first.move(:bottom) todo_list.items.last.move(:higher)## Overriding defaults By default, when including ActsAsList::Mongoid, the field is set to :pos and the acts_as_list column to :pos. To change this:
include ActsAsList::Mongoid field :pos, :type => Integer acts_as_list :column => :pos### List initialization In order for the list items to be initialized properly, it is necessary to call the method
init_list!
on the
collection in order for the position of each list item to be set to an initial position.
+Example:+
todo_list.items.init_list!
## New move API borrowed from Data Mapper *in-list* plugin
item.move(:highest) # moves to top of list. item.move(:lowest) # moves to bottom of list. item.move(:top) # moves to top of list. item.move(:bottom) # moves to bottom of list. item.move(:up) # moves one up (:higher and :up is the same) within the scope. item.move(:down) # moves one up (:lower and :down is the same) within the scope. item.move(:to => position) # moves item to a specific position. item.move(:above => other) # moves item above the other item.* item.move(:below => other)## Running the specsrspec spec