Module | Sequel::Plugins::List
In: | lib/sequel/plugins/list.rb

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:

      class Item < Sequel::Model(:items)
        plugin :list # will use :position field for position
        plugin :list, :field=>:pos # will use :pos field for position
      end

      item = Item[1]

      # Get the next or previous item in the list

      item.next
      item.prev

      # Modify the item's position, which may require modifying other items in
      # the same list

      item.move_to(3)
      item.move_to_top
      item.move_to_bottom
      item.move_up
      item.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.

Copyright (c) 2007-2010 Sharon Rosner, Wayne E. Seguin, Aman Gupta, Adrian Madrid, Jeremy Evans

### Methods

configure

### Classes and Modules

Module Sequel::Plugins::List::ClassMethods
Module Sequel::Plugins::List::InstanceMethods

### Public Class methods

configure(model, opts = {})

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.

[Source]

        # File lib/sequel/plugins/list.rb, line 56
    56:       def self.configure(model, opts = {})
    57:         model.position_field = opts[:field] || :position
    58:         model.dataset = model.dataset.order_prepend(model.position_field)
    59:
    60:         model.scope_proc = case scope = opts[:scope]
    61:         when Symbol
    62:           model.dataset = model.dataset.order_prepend(scope)
    63:           proc{|obj| obj.model.filter(scope=>obj.send(scope))}
    64:         when Array
    65:           model.dataset = model.dataset.order_prepend(*scope)
    66:           proc{|obj| obj.model.filter(scope.map{|s| [s, obj.send(s)]})}
    67:         else
    68:           scope
    69:         end
    70:       end

[Validate]