Make your Mongoid model acts as a list
Ruby
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
example
lib
model
spec
.gitignore
.rspec
Gemfile
README.markdown
Rakefile
VERSION
acts_as_list_mongoid.gemspec
init.rb
mongoid.yml

README.markdown

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::Mongoid   

And 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 specs

rspec spec