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 Jun 24 08:55:58 -0700 2008
commit  47b8a82b187f95dfb4702ebd0b99903fcf2daf44
tree    ea62155c04ac75f2762f0fc35017e816d7a5d72c
parent  e602a514b011d7d510950414b45ce5b9309c4012
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