module Sequel::Plugins::List::InstanceMethods

  1. lib/sequel/plugins/list.rb
Parent: List

Public Instance methods

at_position (p)

The model object at the given position in the list containing this instance.

[show source]
# File lib/sequel/plugins/list.rb, line 86
def at_position(p)
  list_dataset.first(position_field => p)
end
before_create ()

Set the value of the position_field to the maximum value plus 1 unless the position field already has a value.

[show source]
# File lib/sequel/plugins/list.rb, line 92
def before_create
  unless send(position_field)
    send("#{position_field}=", list_dataset.max(position_field).to_i+1)
  end
  super
end
last_position ()

Find the last position in the list containing this instance.

[show source]
# File lib/sequel/plugins/list.rb, line 100
def last_position
  list_dataset.max(position_field).to_i
end
list_dataset ()

A dataset that represents the list containing this instance.

[show source]
# File lib/sequel/plugins/list.rb, line 105
def list_dataset
  model.scope_proc ? model.scope_proc.call(self) : model.dataset
end
move_down (n = 1)

Move this instance down the given number of places in the list, or 1 place if no argument is specified.

[show source]
# File lib/sequel/plugins/list.rb, line 111
def move_down(n = 1)
  move_to(position_value + n)
end
move_to (target, lp = nil)

Move this instance to the given place in the list. Raises an exception if target is less than 1 or greater than the last position in the list.

[show source]
# File lib/sequel/plugins/list.rb, line 117
def move_to(target, lp = nil)
  current = position_value
  if target != current
    checked_transaction do
      ds = list_dataset
      op, ds = if target < current
        raise(Sequel::Error, "Moving too far up (target = #{target})") if target < 1
        [:+, ds.filter(position_field=>target...current)]
      else
        lp ||= last_position
        raise(Sequel::Error, "Moving too far down (target = #{target}, last_position = #{lp})") if target > lp
        [:-, ds.filter(position_field=>(current + 1)..target)]
      end
      ds.update(position_field => Sequel::SQL::NumericExpression.new(op, position_field, 1))
      update(position_field => target)
    end
  end
  self
end
move_to_bottom ()

Move this instance to the bottom (last position) of the list.

[show source]
# File lib/sequel/plugins/list.rb, line 138
def move_to_bottom
  lp = last_position 
  move_to(lp, lp)
end
move_to_top ()

Move this instance to the top (first position, position 1) of the list.

[show source]
# File lib/sequel/plugins/list.rb, line 144
def move_to_top
  move_to(1)
end
move_up (n = 1)

Move this instance the given number of places up in the list, or 1 place if no argument is specified.

[show source]
# File lib/sequel/plugins/list.rb, line 150
def move_up(n = 1)
  move_to(position_value - n) 
end
next (n = 1)

The model instance the given number of places below this model instance in the list, or 1 place below if no argument is given.

[show source]
# File lib/sequel/plugins/list.rb, line 156
def next(n = 1)
  n == 0 ? self : at_position(position_value + n)
end
position_value ()

The value of the model’s position field for this instance.

[show source]
# File lib/sequel/plugins/list.rb, line 161
def position_value
  send(position_field)
end
prev (n = 1)

The model instance the given number of places below this model instance in the list, or 1 place below if no argument is given.

[show source]
# File lib/sequel/plugins/list.rb, line 167
def prev(n = 1)
  self.next(n * -1)
end