public
Description: Extras for DataMapper, including bridges to DataObjects::Migrations and Merb::DataMapper
Homepage: http://datamapper.org
Clone URL: git://github.com/sam/dm-more.git
Dan Kubb (author)
Tue Jul 15 12:37:10 -0700 2008
commit  06a9599d5ed86b70441ce9fc15cc296470b42a93
tree    ee05ee97d681ab2ecdf55e22046114ce03c8b083
parent  c366fee263c578c2363b2242d61b935d8b556094
dm-more / dm-is-list
name age message
..
file LICENSE Thu Jun 19 06:21:38 -0700 2008 added preliminary is_list in own branch, far fr... [somebee]
file README Loading commit data...
file Rakefile
file TODO Thu Jun 19 12:47:13 -0700 2008 Added dbussink's dm-aggregates patch to all agg... [Dan Kubb]
directory lib/
directory spec/
dm-is-list/README
dm-is-list
==========

DataMapper plugin for creating and organizing lists.

== Installation

Download dm-more and install dm-is-list. Remember to require it in your app.

== Getting started

Lets say we have a user-class, and we want to give users the possibility of
having their own todo-lists

class Todo
  include DataMapper::Resource

  property :id, Serial
  property :title, String
  property :done, DateTime

  belongs_to :user

  # here we define that this should be a list, scoped on :user_id
  is :list, :scope => [:user_id]
end

You can now move objects around like this:

 item = Todo.get(1)
 other = Todo.get(2)

 item.move(:highest)        # moves to top of list
 item.move(:lowest)         # moves to bottom of list
 item.move(:up)             # moves one up (:higher and :up is the same)
 item.move(:down)           # moves one up (:lower and :down is the same)
 item.move(:to => position) # moves item to a specific position
 item.move(:above => other) # moves item above the other item.*
 item.move(:below => other) # moves item above the other item.*

 * won't move if the other item is in another scope. (should this be allowed?)

The list will try to act as intelligently as possible. If you set the position
manually, and then save, the list will reorganize itself to correctly:

 item.position = 3 # setting position manually
 item.save # the list will now move the item correctly, and updating others

If you move items between scopes, the list will also try to do what you most
likely want to do:

 item.user_id # => 1
 item.user_id = 2 # giving this item to another user
 item.save # the list will now have detached item from old list, and inserted
           # at the bottom of the new (user 2) list.

If something is not behaving intuitively, it is a bug, and should be reported.
Report it here: http://wm.lighthouseapp.com/projects/4819-datamapper/overview