arboreal 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/arboreal/instance_methods.rb +15 -14
- data/lib/arboreal/version.rb +1 -1
- metadata +21 -11
@@ -10,7 +10,7 @@ module Arboreal
|
|
10
10
|
def ancestor_ids
|
11
11
|
ancestry_string.sub(/^-/, "").split("-").map { |x| x.to_i }
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
# return a scope matching all ancestors of this node
|
15
15
|
def ancestors
|
16
16
|
model_base_class.scoped(:conditions => ancestor_conditions, :order => :ancestry_string)
|
@@ -20,12 +20,12 @@ module Arboreal
|
|
20
20
|
def descendants
|
21
21
|
model_base_class.scoped(:conditions => descendant_conditions)
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
# return a scope matching all descendants of this node, AND the node itself
|
25
25
|
def subtree
|
26
26
|
model_base_class.scoped(:conditions => subtree_conditions)
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
# return a scope matching all siblings of this node (NOT including the node itself)
|
30
30
|
def siblings
|
31
31
|
model_base_class.scoped(:conditions => sibling_conditions)
|
@@ -35,17 +35,17 @@ module Arboreal
|
|
35
35
|
def root
|
36
36
|
ancestors.first || self
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
private
|
40
40
|
|
41
41
|
def model_base_class
|
42
42
|
self.class.base_class
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
def table_name
|
46
46
|
self.class.table_name
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
def ancestor_conditions
|
50
50
|
["id in (?)", ancestor_ids]
|
51
51
|
end
|
@@ -60,7 +60,7 @@ module Arboreal
|
|
60
60
|
id, path_string + "%"
|
61
61
|
]
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
def sibling_conditions
|
65
65
|
[
|
66
66
|
"#{table_name}.id <> ? AND #{table_name}.parent_id = ?",
|
@@ -69,13 +69,14 @@ module Arboreal
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def populate_ancestry_string
|
72
|
+
self.ancestry_string = nil if parent_id_changed?
|
72
73
|
model_base_class.send(:with_exclusive_scope) do
|
73
|
-
self.ancestry_string
|
74
|
+
self.ancestry_string ||= parent ? parent.path_string : "-"
|
74
75
|
end
|
75
76
|
end
|
76
|
-
|
77
|
+
|
77
78
|
def validate_parent_not_ancestor
|
78
|
-
if self.id
|
79
|
+
if self.id
|
79
80
|
if parent_id == self.id
|
80
81
|
errors.add(:parent, "can't be the record itself")
|
81
82
|
end
|
@@ -84,25 +85,25 @@ module Arboreal
|
|
84
85
|
end
|
85
86
|
end
|
86
87
|
end
|
87
|
-
|
88
|
+
|
88
89
|
def detect_ancestry_change
|
89
90
|
if ancestry_string_changed? && !new_record?
|
90
91
|
old_path_string = "#{ancestry_string_was}#{id}-"
|
91
92
|
@ancestry_change = [old_path_string, path_string]
|
92
93
|
end
|
93
94
|
end
|
94
|
-
|
95
|
+
|
95
96
|
def apply_ancestry_change_to_descendants
|
96
97
|
if @ancestry_change
|
97
98
|
old_ancestry_string, new_ancestry_string = *@ancestry_change
|
98
99
|
connection.update(<<-SQL.squish)
|
99
|
-
UPDATE #{table_name}
|
100
|
+
UPDATE #{table_name}
|
100
101
|
SET ancestry_string = REPLACE(ancestry_string, '#{old_ancestry_string}', '#{new_ancestry_string}')
|
101
102
|
WHERE ancestry_string LIKE '#{old_ancestry_string}%'
|
102
103
|
SQL
|
103
104
|
@ancestry_change = nil
|
104
105
|
end
|
105
106
|
end
|
106
|
-
|
107
|
+
|
107
108
|
end
|
108
109
|
end
|
data/lib/arboreal/version.rb
CHANGED
metadata
CHANGED
@@ -1,38 +1,48 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arboreal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.0
|
5
4
|
prerelease:
|
5
|
+
version: 0.2.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Mike Williams
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-12-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
|
16
|
-
|
15
|
+
type: :runtime
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: 2.3.0
|
22
|
-
|
22
|
+
name: activerecord
|
23
23
|
prerelease: false
|
24
|
-
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: activesupport
|
27
|
-
requirement: &70308116360000 !ruby/object:Gem::Requirement
|
24
|
+
requirement: !ruby/object:Gem::Requirement
|
28
25
|
none: false
|
29
26
|
requirements:
|
30
27
|
- - ! '>='
|
31
28
|
- !ruby/object:Gem::Version
|
32
29
|
version: 2.3.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
33
31
|
type: :runtime
|
32
|
+
version_requirements: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 2.3.0
|
38
|
+
name: activesupport
|
34
39
|
prerelease: false
|
35
|
-
|
40
|
+
requirement: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.3.0
|
36
46
|
description: ! 'Arboreal is yet another extension to ActiveRecord to support tree-shaped
|
37
47
|
data structures.
|
38
48
|
|
@@ -90,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
100
|
version: '0'
|
91
101
|
requirements: []
|
92
102
|
rubyforge_project:
|
93
|
-
rubygems_version: 1.8.
|
103
|
+
rubygems_version: 1.8.24
|
94
104
|
signing_key:
|
95
105
|
specification_version: 3
|
96
106
|
summary: Efficient tree structures for ActiveRecord
|