mongo_mapper_acts_as_tree 0.2 → 0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/mongo_mapper/plugins/acts_as_tree.rb +22 -21
- data/lib/mongo_mapper/plugins/version.rb +1 -1
- data/test/acts_as_tree_test.rb +11 -21
- data/test/test_helper.rb +1 -0
- metadata +8 -8
@@ -12,8 +12,13 @@ module MongoMapper
|
|
12
12
|
configuration = { :foreign_key => :parent_id, :order => nil, :counter_cache => nil }
|
13
13
|
configuration.update(options) if options.is_a?(Hash)
|
14
14
|
|
15
|
+
# automatically create needed keys if they don't already exist
|
16
|
+
key configuration[:foreign_key], ObjectId unless keys.key?(configuration[:foreign_key])
|
17
|
+
key configuration[:foreign_key].to_s.pluralize.to_sym, Array unless keys.key?(configuration[:foreign_key].to_s.pluralize.to_sym)
|
18
|
+
|
15
19
|
belongs_to :parent, :class_name => name, :foreign_key => configuration[:foreign_key], :counter_cache => configuration[:counter_cache]
|
16
20
|
many :children, :class_name => name, :foreign_key => configuration[:foreign_key], :order => configuration[:order], :dependent => :destroy
|
21
|
+
before_save :set_parents
|
17
22
|
|
18
23
|
class_eval <<-EOV
|
19
24
|
def self.roots
|
@@ -23,6 +28,23 @@ module MongoMapper
|
|
23
28
|
def self.root
|
24
29
|
where("#{configuration[:foreign_key]}".to_sym => nil).sort("#{configuration[:order]}").first
|
25
30
|
end
|
31
|
+
|
32
|
+
def set_parents
|
33
|
+
self.#{configuration[:foreign_key].to_s.pluralize} = parent.#{configuration[:foreign_key].to_s.pluralize}.dup << #{configuration[:foreign_key]} if parent?
|
34
|
+
end
|
35
|
+
|
36
|
+
def ancestors
|
37
|
+
self.class.where(:id => { '$in' => self.#{configuration[:foreign_key].to_s.pluralize} }).all.reverse || []
|
38
|
+
end
|
39
|
+
|
40
|
+
def root
|
41
|
+
self.class.find(self.#{configuration[:foreign_key].to_s.pluralize}.first) || self
|
42
|
+
end
|
43
|
+
|
44
|
+
def descendants
|
45
|
+
self.class.where('#{configuration[:foreign_key].to_s.pluralize}' => self.id).all
|
46
|
+
end
|
47
|
+
|
26
48
|
EOV
|
27
49
|
end
|
28
50
|
end
|
@@ -31,32 +53,11 @@ module MongoMapper
|
|
31
53
|
|
32
54
|
# --------------------------------------------------------------------------------
|
33
55
|
module InstanceMethods
|
34
|
-
# Returns list of ancestors, starting from parent until root.
|
35
|
-
#
|
36
|
-
# subchild1.ancestors # => [child1, root]
|
37
|
-
def ancestors
|
38
|
-
node, nodes = self, []
|
39
|
-
nodes << node = node.parent while node.parent?
|
40
|
-
nodes
|
41
|
-
end
|
42
|
-
|
43
|
-
# Returns the root node of the tree.
|
44
|
-
def root
|
45
|
-
node = self
|
46
|
-
node = node.parent while node.parent?
|
47
|
-
node
|
48
|
-
end
|
49
56
|
|
50
|
-
# Returns all siblings of the current node.
|
51
|
-
#
|
52
|
-
# subchild1.siblings # => [subchild2]
|
53
57
|
def siblings
|
54
58
|
self_and_siblings - [self]
|
55
59
|
end
|
56
60
|
|
57
|
-
# Returns all siblings and a reference to the current node.
|
58
|
-
#
|
59
|
-
# subchild1.self_and_siblings # => [subchild1, subchild2]
|
60
61
|
def self_and_siblings
|
61
62
|
parent? ? parent.children : self.class.roots
|
62
63
|
end
|
data/test/acts_as_tree_test.rb
CHANGED
@@ -2,41 +2,23 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
# SETUP TEST
|
6
|
-
|
7
|
-
# class ActiveSupport::TestCase
|
8
|
-
# def assert_queries(num = 1)
|
9
|
-
# $query_count = 0
|
10
|
-
# yield
|
11
|
-
# ensure
|
12
|
-
# assert_equal num, $query_count, "#{$query_count} instead of #{num} queries were executed."
|
13
|
-
# end
|
14
|
-
#
|
15
|
-
# def assert_no_queries(&block)
|
16
|
-
# assert_queries(0, &block)
|
17
|
-
# end
|
18
|
-
# end
|
19
|
-
|
20
|
-
|
21
|
-
|
22
5
|
# SETUP CLASSES
|
23
6
|
|
24
7
|
class Mixin
|
25
8
|
include MongoMapper::Document
|
26
9
|
plugin MongoMapper::Plugins::ActsAsTree
|
27
|
-
key :parent_id, ObjectId
|
28
10
|
end
|
29
11
|
|
30
12
|
class TreeMixin < Mixin
|
31
|
-
acts_as_tree
|
13
|
+
acts_as_tree
|
32
14
|
end
|
33
15
|
|
34
16
|
class TreeMixinWithoutOrder < Mixin
|
35
|
-
acts_as_tree
|
17
|
+
acts_as_tree
|
36
18
|
end
|
37
19
|
|
38
20
|
class RecursivelyCascadedTreeMixin < Mixin
|
39
|
-
acts_as_tree
|
21
|
+
acts_as_tree
|
40
22
|
has_one :first_child, :class_name => 'RecursivelyCascadedTreeMixin', :foreign_key => :parent_id
|
41
23
|
end
|
42
24
|
|
@@ -100,6 +82,14 @@ class TreeTest < ActiveSupport::TestCase
|
|
100
82
|
assert_equal [], @root3.ancestors
|
101
83
|
end
|
102
84
|
|
85
|
+
def test_descendants
|
86
|
+
assert_equal [@root_child1, @child1_child, @root_child2], @root1.descendants
|
87
|
+
assert_equal [@child1_child], @root_child1.descendants
|
88
|
+
assert_equal [], @root_child2.descendants
|
89
|
+
assert_equal [], @root2.descendants
|
90
|
+
assert_equal [], @root3.descendants
|
91
|
+
end
|
92
|
+
|
103
93
|
def test_root
|
104
94
|
assert_equal @root1, TreeMixin.root
|
105
95
|
assert_equal @root1, @root1.root
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongo_mapper_acts_as_tree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 13
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: "0.
|
8
|
+
- 3
|
9
|
+
version: "0.3"
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Tomas Celizna
|
@@ -14,12 +14,12 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-02-
|
17
|
+
date: 2011-02-24 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
+
type: :runtime
|
21
22
|
name: mongo_mapper
|
22
|
-
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
none: false
|
25
25
|
requirements:
|
@@ -29,11 +29,11 @@ dependencies:
|
|
29
29
|
segments:
|
30
30
|
- 0
|
31
31
|
version: "0"
|
32
|
-
|
32
|
+
prerelease: false
|
33
33
|
version_requirements: *id001
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
|
+
type: :development
|
35
36
|
name: rake
|
36
|
-
prerelease: false
|
37
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
38
38
|
none: false
|
39
39
|
requirements:
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
segments:
|
44
44
|
- 0
|
45
45
|
version: "0"
|
46
|
-
|
46
|
+
prerelease: false
|
47
47
|
version_requirements: *id002
|
48
48
|
description:
|
49
49
|
email:
|