Module: Lore::Behaviours::Movable

Defined in:
lib/lore/behaviours/movable.rb

Overview

Move an entity within a given criteria range, e.g. within nodes of a tree.

Usage:

class My_Model < Lore::Model
extend Lore::Behaviours::Movable
include Lore::Behaviours::Movable_Entity
 # ...
 ordered_by(:position)
end

# Will move entity to position 12 within child entries
# of node with id 2: 
my_model_entity.move_to(12, (My_Model.parent_id == 2))
# Same as
My_Model.move(my_model_entity, 12, (My_Model.parent_id == 2))

Instance Method Summary collapse

Instance Method Details

#move(inst, sortpos, criteria) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/lore/behaviours/movable.rb', line 30

def move(inst, sortpos, criteria)
  sortpos = sortpos.to_i
  return if sortpos < 1

  criteria ||= Lore::Clause.new()
  sortpos_old = inst.attr[@order_attr_name].to_i

  # move down: 
  if sortpos.to_i > sortpos_old then
    self.update { |na|
      na.set({@order_attr_name => @order_attr-1}).where(
        (criteria) &
        (@order_attr <= sortpos) &
        (@order_attr > sortpos_old)
      )
    }
  # move up: 
  elsif sortpos.to_i < sortpos_old then
    self.update { |na|
      na.set({@order_attr_name => @order_attr+1}).where(
        (criteria) &
        (@order_attr >= sortpos) &
        (@order_attr < sortpos_old)
      )
    }
  end
  # In case we actually had to move the entity: 
  if sortpos != sortpos_old then
    inst.set_attribute_value(@order_attr_name, sortpos)
    inst.commit()
  end
end

#ordered_by(attrib) ⇒ Object



25
26
27
28
# File 'lib/lore/behaviours/movable.rb', line 25

def ordered_by(attrib)
  @order_attr = attrib
  @order_attr_name = attrib.to_s.split('.')[-1].intern
end