Module: Sequel::Plugins::List

Defined in:

lib/sequel/plugins/list.rb

Overview

The list plugin allows for model instances to be part of an ordered list,
based on a position field in the database. It can either consider all rows
in the table as being from the same list, or you can specify scopes so that
multiple lists can be kept in the same table.

Basic Example:

classItem<Sequel::Model(:items)plugin:list# will use :position field for position
plugin:list,:field=>:pos# will use :pos field for position
enditem=Item[1]# Get the next or previous item in the list
item.nextitem.prev# Modify the item's position, which may require modifying other items in
# the same list
item.move_to(3)item.move_to_topitem.move_to_bottomitem.move_upitem.move_down

You can provide a :scope option to scope the list. This option
can be a symbol or array of symbols specifying column name(s), or a proc
that accepts a model instance and returns a dataset representing the list
the object is in.

For example, if each item has a user_id field, and you want every
user to have their own list:

Item.plugin:list,:scope=>:user_id

Note that using this plugin modifies the order of the model's dataset
to sort by the position and scope fields. Also note that this plugin is
subject to race conditions, and is not safe when concurrent modifications
are made to the same list.

Additionally, note that unlike ruby arrays, the list plugin assumes that
the first entry in the list has position 1, not position 0.

Class Method Details

Set the position_field and scope_proc attributes for the
model, using the :field and :scope options, respectively.
The :scope option can be a symbol, array of symbols, or a proc
that accepts a model instance and returns a dataset representing the list.
Also, modify the model dataset's order to order by the position and
scope fields.