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:
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 unlike ruby arrays, the list plugin assumes that the first entry in the list has position 1, not position 0.
Copyright © 2007-2010 Sharon Rosner, Wayne E. Seguin, Aman Gupta, Adrian Madrid, Jeremy Evans
Defined Under Namespace
Modules: ClassMethods, InstanceMethods
Class Method Summary collapse
-
.configure(model, opts = {}) ⇒ Object
Set the
position_field
andscope_proc
attributes for the model, using the:field
and:scope
options, respectively.
Class Method Details
.configure(model, opts = {}) ⇒ Object
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.
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/sequel/plugins/list.rb', line 54 def self.configure(model, opts = {}) model.position_field = opts[:field] || :position model.dataset = model.dataset.order_prepend(model.position_field) model.scope_proc = case scope = opts[:scope] when Symbol model.dataset = model.dataset.order_prepend(scope) proc{|obj| obj.model.filter(scope=>obj.send(scope))} when Array model.dataset = model.dataset.order_prepend(*scope) proc{|obj| obj.model.filter(scope.map{|s| [s, obj.send(s)]})} else scope end end |