ramdiv-mongo_mapper_acts_as_tree 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.0
1
+ 0.0.1
@@ -25,19 +25,20 @@ module MongoMapper
25
25
  extend Fields
26
26
  extend ClassMethods
27
27
 
28
- key parent_id_field, String
29
- key path_field, String, :default => ""
28
+ key parent_id_field, ObjectId
29
+ key path_field, Array, :default => []
30
30
  key depth_field, Integer, :default => 0
31
31
 
32
32
  after_save :move_children
33
33
  before_save :will_save_tree
34
- # before_destroy :destroy_descendants
34
+ before_destroy :destroy_descendants
35
+ ensure_index([path_field, 1])
35
36
  end
36
37
  end
37
38
 
38
39
  module ClassMethods
39
40
  def roots
40
- self.find(:all, :conditions => {parent_id_field => nil}, :order => tree_order)
41
+ self.all(parent_id_field => nil, :order => tree_order)
41
42
  end
42
43
  end
43
44
 
@@ -67,17 +68,17 @@ module MongoMapper
67
68
  def fix_position
68
69
  if parent.nil?
69
70
  self[parent_id_field] = nil
70
- self[path_field] = ""
71
+ self[path_field] = []
71
72
  self[depth_field] = 0
72
73
  else
73
- self[parent_id_field] = parent.id
74
- self[path_field] = parent[path_field] + ":" + parent.id.to_s
74
+ self[parent_id_field] = parent._id
75
+ self[path_field] = parent[path_field] + [parent._id]
75
76
  self[depth_field] = parent[depth_field] + 1
76
77
  end
77
78
  end
78
79
 
79
80
  def parent
80
- @_parent or (self[parent_id_field] ? self.class.find(self[parent_id_field]) : nil)
81
+ @_parent or (self[parent_id_field].nil? ? nil : self.class.find(self[parent_id_field]))
81
82
  end
82
83
 
83
84
  def root?
@@ -85,12 +86,12 @@ module MongoMapper
85
86
  end
86
87
 
87
88
  def root
88
- self.class.find(self[path_field].split(":")[1]) or self
89
+ self[path_field].first.nil? ? self : self.class.find(self[path_field].first)
89
90
  end
90
91
 
91
92
  def ancestors
92
93
  return [] if root?
93
- self.class.find(self[path_field].split(":")[1..-1].collect{|i| Mongo::ObjectID.from_string(i)})
94
+ self.class.find(self[path_field])
94
95
  end
95
96
 
96
97
  def self_and_ancestors
@@ -98,21 +99,20 @@ module MongoMapper
98
99
  end
99
100
 
100
101
  def siblings
101
- self.class.find(:all, :conditions => {:_id => {"$ne" => self._id}, parent_id_field => self[parent_id_field]}, :order => tree_order)
102
+ self.class.all(:_id => {"$ne" => self._id}, parent_id_field => self[parent_id_field], :order => tree_order)
102
103
  end
103
104
 
104
105
  def self_and_siblings
105
- self.class.find(:all, :conditions => {parent_id_field => self[parent_id_field]}, :order => tree_order)
106
+ self.class.all(parent_id_field => self[parent_id_field], :order => tree_order)
106
107
  end
107
108
 
108
109
  def children
109
- self.class.find(:all, :conditions => {parent_id_field => self._id.to_s}, :order => tree_order)
110
+ self.class.all(parent_id_field => self._id.to_s, :order => tree_order)
110
111
  end
111
112
 
112
113
  def descendents
113
114
  return [] if new_record?
114
- sorting_options = tree_order.split(",").map(&:strip).map(&:split).map{|item| [item[0], ((item[1].nil? or item[1].downcase == "asc") ? "asc" : "desc")]}.flatten
115
- self.class.collection.find({path_field => /#{self._id}/}, {:sort => sorting_options}).map{|i| self.class.new(i)} or []
115
+ self.class.all(path_field => self._id, :order => tree_order)
116
116
  end
117
117
 
118
118
  def self_and_descendents
@@ -120,7 +120,7 @@ module MongoMapper
120
120
  end
121
121
 
122
122
  def is_ancestor_of?(other)
123
- !(other[path_field] =~ /#{self._id}/).nil?
123
+ other[path_field].include?(self._id)
124
124
  end
125
125
 
126
126
  def is_or_is_ancestor_of?(other)
@@ -128,7 +128,7 @@ module MongoMapper
128
128
  end
129
129
 
130
130
  def is_descendant_of?(other)
131
- !(self[path_field] =~ /#{other._id}/).nil?
131
+ self[path_field].include?(other._id)
132
132
  end
133
133
 
134
134
  def is_or_is_descendant_of?(other)
@@ -153,6 +153,10 @@ module MongoMapper
153
153
  @_will_move = true
154
154
  end
155
155
  end
156
+
157
+ def destroy_descendants
158
+ self.class.destroy(self.descendents.map(&:_id))
159
+ end
156
160
  end
157
161
 
158
162
  module Fields
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ramdiv-mongo_mapper_acts_as_tree}
8
- s.version = "0.0.0"
8
+ s.version = "0.0.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jakob Vidmar"]
data/test/test_order.rb CHANGED
@@ -16,7 +16,7 @@ class TestMongomapperActsAsTree < Test::Unit::TestCase
16
16
  assert_equal OrderedCategory.roots, [@root_2, @root_1]
17
17
 
18
18
  assert_equal @root_1.children, [@child_1, @child_3, @child_2]
19
-
19
+
20
20
  assert_equal @root_1.descendents, [@child_1, @child_2_1, @child_3, @child_2]
21
21
  assert_equal @root_1.self_and_descendents, [@root_1, @child_1, @child_2_1, @child_3, @child_2]
22
22
 
data/test/test_tree.rb CHANGED
@@ -12,10 +12,11 @@ class TestMongomapperActsAsTree < Test::Unit::TestCase
12
12
  @root_2 = Category.create(:name => "Root 2")
13
13
  end
14
14
 
15
+
15
16
  should "have roots" do
16
17
  assert eql_arrays?(Category.roots, [@root_1, @root_2])
17
18
  end
18
-
19
+
19
20
  context "node" do
20
21
  should "have a root" do
21
22
  assert_equal @root_1.root, @root_1
@@ -111,7 +112,7 @@ class TestMongomapperActsAsTree < Test::Unit::TestCase
111
112
 
112
113
  @child_2.save
113
114
  @child_2_1.reload
114
-
115
+
115
116
  assert @root_2.is_or_is_ancestor_of?(@child_2_1)
116
117
  assert @child_2_1.is_or_is_descendant_of?(@root_2)
117
118
  assert @root_2.descendents.include?(@child_2_1)
@@ -122,6 +123,11 @@ class TestMongomapperActsAsTree < Test::Unit::TestCase
122
123
  assert !@root_1.save
123
124
  end
124
125
  end
126
+
127
+ should "destroy descendents when destroyed" do
128
+ @child_2.destroy
129
+ assert_nil Category.find(@child_2_1._id)
130
+ end
125
131
  end
126
132
 
127
133
  context "root node" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ramdiv-mongo_mapper_acts_as_tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jakob Vidmar