Module: MongoMapper::Plugins::ReferencedTree::ClassMethods

Defined in:
lib/mm-referenced-tree.rb

Instance Method Summary collapse

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(options={})
  options.reverse_merge!({
    :scope => nil
  })

  write_inheritable_attribute :referenced_tree_options, 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