Module: CollectiveIdea::Acts::NestedSet::Model::Movable
- Defined in:
- lib/awesome_nested_set/model/movable.rb
Instance Method Summary collapse
-
#find_left_neighbor(parent, order_attribute, ascending) ⇒ Object
Find the node immediately to the left of this node.
-
#move_left ⇒ Object
Shorthand method for finding the left sibling and moving to the left of it.
- #move_possible?(target) ⇒ Boolean
-
#move_right ⇒ Object
Shorthand method for finding the right sibling and moving to the right of it.
- #move_to(target, position) ⇒ Object
-
#move_to_child_of(node) ⇒ Object
Move the node to the child of another node.
-
#move_to_child_with_index(node, index) ⇒ Object
Move the node to the child of another node with specify index.
-
#move_to_left_of(node) ⇒ Object
Move the node to the left of another node.
-
#move_to_ordered_child_of(parent, order_attribute, ascending = true) ⇒ Object
Order children in a nested set by an attribute Can order by any attribute class that uses the Comparable mixin, for example a string or integer Usage example when sorting categories alphabetically: @new_category.move_to_ordered_child_of(@root, “name”).
-
#move_to_right_of(node) ⇒ Object
Move the node to the right of another node.
-
#move_to_root ⇒ Object
Move the node to root nodes.
Instance Method Details
#find_left_neighbor(parent, order_attribute, ascending) ⇒ Object
Find the node immediately to the left of this node.
87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/awesome_nested_set/model/movable.rb', line 87 def find_left_neighbor(parent, order_attribute, ascending) left = nil parent.children.each do |n| if ascending left = n if n.send(order_attribute) < self.send(order_attribute) else left = n if n.send(order_attribute) > self.send(order_attribute) end end left end |
#move_left ⇒ Object
Shorthand method for finding the left sibling and moving to the left of it.
18 19 20 |
# File 'lib/awesome_nested_set/model/movable.rb', line 18 def move_left move_to_left_of left_sibling end |
#move_possible?(target) ⇒ Boolean
9 10 11 12 13 14 15 |
# File 'lib/awesome_nested_set/model/movable.rb', line 9 def move_possible?(target) self != target && # Can't target self same_scope?(target) && # can't be in different scopes # detect impossible move within_bounds?(target.left, target.left) && within_bounds?(target.right, target.right) end |
#move_right ⇒ Object
Shorthand method for finding the right sibling and moving to the right of it.
23 24 25 |
# File 'lib/awesome_nested_set/model/movable.rb', line 23 def move_right move_to_right_of right_sibling end |
#move_to(target, position) ⇒ Object
99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/awesome_nested_set/model/movable.rb', line 99 def move_to(target, position) prevent_unpersisted_move run_callbacks :move do in_tenacious_transaction do target = reload_target(target, position) self.reload_nested_set Move.new(target, position, self).move update_counter_cache end after_move_to(target, position) end end |
#move_to_child_of(node) ⇒ Object
Move the node to the child of another node
38 39 40 |
# File 'lib/awesome_nested_set/model/movable.rb', line 38 def move_to_child_of(node) move_to node, :child end |
#move_to_child_with_index(node, index) ⇒ Object
Move the node to the child of another node with specify index
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/awesome_nested_set/model/movable.rb', line 43 def move_to_child_with_index(node, index) if node.children.empty? move_to_child_of(node) elsif node.children.count == index move_to_right_of(node.children.last) else my_position = node.children.to_a.index(self) if my_position && my_position < index # e.g. if self is at position 0 and we want to move self to position 1 then self # needs to move to the *right* of the node at position 1. That's because the node # that is currently at position 1 will be at position 0 after the move completes. move_to_right_of(node.children[index]) elsif my_position && my_position == index # do nothing. already there. else move_to_left_of(node.children[index]) end end end |
#move_to_left_of(node) ⇒ Object
Move the node to the left of another node
28 29 30 |
# File 'lib/awesome_nested_set/model/movable.rb', line 28 def move_to_left_of(node) move_to node, :left end |
#move_to_ordered_child_of(parent, order_attribute, ascending = true) ⇒ Object
Order children in a nested set by an attribute Can order by any attribute class that uses the Comparable mixin, for example a string or integer Usage example when sorting categories alphabetically: @new_category.move_to_ordered_child_of(@root, “name”)
71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/awesome_nested_set/model/movable.rb', line 71 def move_to_ordered_child_of(parent, order_attribute, ascending = true) self.move_to_root and return unless parent left_neighbor = find_left_neighbor(parent, order_attribute, ascending) self.move_to_child_of(parent) return unless parent.children.many? if left_neighbor self.move_to_right_of(left_neighbor) else # Self is the left most node. self.move_to_left_of(parent.children[0]) end end |
#move_to_right_of(node) ⇒ Object
Move the node to the right of another node
33 34 35 |
# File 'lib/awesome_nested_set/model/movable.rb', line 33 def move_to_right_of(node) move_to node, :right end |
#move_to_root ⇒ Object
Move the node to root nodes
64 65 66 |
# File 'lib/awesome_nested_set/model/movable.rb', line 64 def move_to_root move_to self, :root end |