acts_as_better_tree 0.9.4 → 0.9.5
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/.gitignore +19 -0
- data/Gemfile.lock +1 -1
- data/README.md +15 -5
- data/lib/acts_as_better_tree/version.rb +1 -1
- data/lib/acts_as_better_tree.rb +11 -7
- data/spec/acts_as_better_tree_spec.rb +3 -0
- metadata +3 -6
- data/.DS_Store +0 -0
- data/acts_as_better_tree-0.0.1.gem +0 -0
- data/acts_as_better_tree-0.9.3.gem +0 -0
- data/gemtest +0 -0
data/.gitignore
ADDED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# ActsAsBetterTree
|
2
2
|
|
3
|
-
|
4
|
-
It is backwards compatible with acts_as_tree and remains fast with large datasets by storing the ancestry of every node in the field csv_ids.
|
3
|
+
An alternative to nested_sets and acts_as_tree. Designed to be a drop in replacement for acts_as_tree. Replaces betternestedset without the slow inserts when dealing with a large dataset. Used by upillar.com on a dataset of over 900,000 categories with no slow downs. In tests it shows a 285% speed increase on inserts with a dataset of 100k categories. As datasets become larger its insert speed stays about the same when nested_sets become slower. In all of my tests read speeds have been comparable with nested sets on everything but all_children which is inperceptibly slower on a dataset of 100k than betternestedset.
|
5
4
|
|
6
5
|
|
7
6
|
## Installation
|
@@ -29,7 +28,7 @@ Or install it yourself as:
|
|
29
28
|
t.column :name, :string
|
30
29
|
end
|
31
30
|
|
32
|
-
If upgrading from acts_as_tree just add root_id and csv_ids and run Category.
|
31
|
+
If upgrading from acts_as_tree just add root_id and csv_ids and run Category.tree_to_better_tree!
|
33
32
|
|
34
33
|
class Category < ActiveRecord::Base
|
35
34
|
acts_as_better_tree :order => "name"
|
@@ -49,8 +48,19 @@ Or install it yourself as:
|
|
49
48
|
child1.parent # => root
|
50
49
|
root.children # => [child1]
|
51
50
|
root.children.first.children.first # => subchild1
|
52
|
-
|
53
|
-
|
51
|
+
child1.self_and_ancestors # => [root, child1]
|
52
|
+
child1.ancestors
|
53
|
+
child1.siblings
|
54
|
+
child1.self_and_siblings
|
55
|
+
child1.move_to_child_of(parent)
|
56
|
+
child1.childless?
|
57
|
+
child1.ancestor_of?(subchild1)
|
58
|
+
child1.descendant_of?(root)
|
59
|
+
root.to_csv # => "root,child1,subchild1\n" returns and array of all children
|
60
|
+
Category.to_csv # => "root,child1,subchild1\nroot,child1,subchild2\n" returns entire tree in a csv string
|
61
|
+
|
62
|
+
|
63
|
+
Copyright (c) 2008 Isaac Sloan, released under the MIT license.
|
54
64
|
Inspired by David Heinemeier Hansson's acts_as_tree
|
55
65
|
|
56
66
|
## Contributing
|
data/lib/acts_as_better_tree.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require "acts_as_better_tree/version"
|
2
|
-
|
2
|
+
require "csv"
|
3
3
|
module ActiveRecord
|
4
4
|
module Acts
|
5
5
|
module BetterTree
|
@@ -27,22 +27,26 @@ module ActiveRecord
|
|
27
27
|
roots(options).first
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
30
|
+
def recursively_traverse(nodes = self.roots, &block)
|
31
31
|
nodes.each do |node|
|
32
32
|
yield node
|
33
|
-
|
33
|
+
recursively_traverse(node.children, &block)
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
37
|
# Call this to upgrade an existing acts_as_tree to acts_as_better_tree
|
38
|
-
def
|
38
|
+
def tree_to_better_tree!(nodes = self.roots)
|
39
39
|
transaction do
|
40
|
-
|
40
|
+
recursively_traverse(nodes) do |node|
|
41
41
|
node.csv_ids = node.build_csv_ids
|
42
42
|
node.save
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
46
|
+
|
47
|
+
def to_csv
|
48
|
+
return new.to_csv(roots)
|
49
|
+
end
|
46
50
|
end
|
47
51
|
end
|
48
52
|
end
|
@@ -123,12 +127,12 @@ module ActiveRecord
|
|
123
127
|
csv = []
|
124
128
|
nodes.each do |node|
|
125
129
|
if node.childless?
|
126
|
-
csv += [node.self_and_ancestors.map(&:name).
|
130
|
+
csv += [node.self_and_ancestors.map(&:name).to_csv]
|
127
131
|
else
|
128
132
|
csv += [to_csv(node.children)]
|
129
133
|
end
|
130
134
|
end
|
131
|
-
return csv.join("
|
135
|
+
return csv.join("")
|
132
136
|
end
|
133
137
|
|
134
138
|
def build_csv_ids
|
@@ -69,4 +69,7 @@ describe "ActsAsBetterTree" do
|
|
69
69
|
bobcats.parent.name.should eql "Cats"
|
70
70
|
end
|
71
71
|
|
72
|
+
it "should return a csv string of all nodes" do
|
73
|
+
Category.to_csv.should eql "Animals,Cats,Lions\nAnimals,Cats,Tiger\nAnimals,Cats,House Cat\nAnimals,Cats,Panther\nAnimals,Cats,Bobcats\n"
|
74
|
+
end
|
72
75
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_better_tree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-06 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: acts_as_better_tree is great for anyone who needs a fast tree capable
|
15
15
|
of handling millions of nodes without slowing down on writes like nestedset or on
|
@@ -20,16 +20,13 @@ executables: []
|
|
20
20
|
extensions: []
|
21
21
|
extra_rdoc_files: []
|
22
22
|
files:
|
23
|
-
- .
|
23
|
+
- .gitignore
|
24
24
|
- Gemfile
|
25
25
|
- Gemfile.lock
|
26
26
|
- LICENSE
|
27
27
|
- README.md
|
28
28
|
- Rakefile
|
29
|
-
- acts_as_better_tree-0.0.1.gem
|
30
|
-
- acts_as_better_tree-0.9.3.gem
|
31
29
|
- acts_as_better_tree.gemspec
|
32
|
-
- gemtest
|
33
30
|
- lib/acts_as_better_tree.rb
|
34
31
|
- lib/acts_as_better_tree/version.rb
|
35
32
|
- spec/acts_as_better_tree_spec.rb
|
data/.DS_Store
DELETED
Binary file
|
Binary file
|
Binary file
|
data/gemtest
DELETED
Binary file
|