Module: MongoMapper::Plugins::ReferencedTree::ClassMethods
- Defined in:
- lib/mm-referenced-tree.rb
Instance Method Summary collapse
- #referenced_tree(options = {}) ⇒ Object
-
#renumber_tree(query = {}) ⇒ Object
renumber a full set of nodes pass the scope into the query to limit it to the nodes you want Eg.
Instance Method Details
#referenced_tree(options = {}) ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# File 'lib/mm-referenced-tree.rb', line 9 def referenced_tree(={}) .reverse_merge!({ :scope => nil }) write_inheritable_attribute :referenced_tree_options, class_inheritable_reader :referenced_tree_options key :reference, Array, :default => [1] key :depth, Integer, :default => 1 before_create :assign_reference before_create :reposition_subsequent_nodes after_destroy :delete_descendants_and_renumber_siblings before_update :renumber_tree_if_reference_changed end |
#renumber_tree(query = {}) ⇒ Object
renumber a full set of nodes pass the scope into the query to limit it to the nodes you want Eg. Something.renumber_tree(:account_id => 123) TODO - make this work on associations, IE account.nodes.renumber_tree
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 62 63 64 65 66 67 68 |
# File 'lib/mm-referenced-tree.rb', line 30 def renumber_tree(query={}) reference = [0] level = 1 level_offset = 0 where(query).sort(:reference.asc).all.each do |node| # it's a level up if node.reference.size > (level + level_offset) if reference == [0] level_offset = 1 else level += 1 reference[level-1] = 0 end # back down a level or more elsif node.reference.size < (level + level_offset) level = node.depth if level_offset > 0 if level == 1 level_offset = 0 else level -= level_offset end end reference = reference[0, level] end reference[level-1] += 1 if node.reference != reference node.set(:reference => reference) end end end |