closure_tree 2.0.0.beta1 → 2.0.0
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/README.md +20 -16
- data/Rakefile +3 -0
- data/lib/closure_tree/acts_as_tree.rb +0 -16
- data/lib/closure_tree/version.rb +1 -1
- metadata +8 -12
data/README.md
CHANGED
@@ -10,13 +10,13 @@ for a description of different tree storage algorithms.
|
|
10
10
|
|
11
11
|
## Setup
|
12
12
|
|
13
|
-
Note that closure_tree is being developed for Rails 3.1.
|
13
|
+
Note that closure_tree is being developed for Rails 3.1.x
|
14
14
|
|
15
15
|
1. Add this to your Gemfile: ```gem 'closure_tree'```
|
16
16
|
|
17
17
|
2. Run ```bundle install```
|
18
18
|
|
19
|
-
3. Add ```acts_as_tree``` to your hierarchical model(s) (see the <
|
19
|
+
3. Add ```acts_as_tree``` to your hierarchical model(s) (see the <em>Available options</em> section below for details).
|
20
20
|
|
21
21
|
4. Add a migration to add a ```parent_id``` column to the model you want to act_as_tree.
|
22
22
|
|
@@ -67,23 +67,29 @@ Note that closure_tree is being developed for Rails 3.1.0.rc1
|
|
67
67
|
Create a root node:
|
68
68
|
|
69
69
|
```ruby
|
70
|
-
grandparent = Tag.create
|
70
|
+
grandparent = Tag.create(:name => 'Grandparent')
|
71
71
|
```
|
72
72
|
|
73
|
-
|
73
|
+
Child nodes are created by appending to the children collection:
|
74
74
|
|
75
75
|
```ruby
|
76
|
-
|
77
|
-
grandparent.add_child parent
|
76
|
+
child = parent.children.create(:name => 'Child')
|
78
77
|
```
|
79
78
|
|
80
|
-
|
79
|
+
You can also append to the children collection:
|
81
80
|
|
82
81
|
```ruby
|
83
|
-
child = Tag.create
|
82
|
+
child = Tag.create(:name => 'Child')
|
84
83
|
parent.children << child
|
85
84
|
```
|
86
|
-
|
85
|
+
|
86
|
+
Or call the "add_child" method:
|
87
|
+
|
88
|
+
```ruby
|
89
|
+
parent = Tag.create(:name => 'Parent')
|
90
|
+
grandparent.add_child parent
|
91
|
+
```
|
92
|
+
|
87
93
|
Then:
|
88
94
|
|
89
95
|
```ruby
|
@@ -99,7 +105,7 @@ Then:
|
|
99
105
|
We can do all the node creation and add_child calls from the prior section with one method call:
|
100
106
|
|
101
107
|
```ruby
|
102
|
-
child = Tag.find_or_create_by_path
|
108
|
+
child = Tag.find_or_create_by_path("grandparent", "parent", "child")
|
103
109
|
```
|
104
110
|
|
105
111
|
You can ```find``` as well as ```find_or_create``` by "ancestry paths". Ancestry paths may be built using any column in your model. The default column is ```name```, which can be changed with the :name_column option provided to ```acts_as_tree```.
|
@@ -111,13 +117,13 @@ Note that the other columns will be null if nodes are created, other than auto-g
|
|
111
117
|
|
112
118
|
When you include ```acts_as_tree``` in your model, you can provide a hash to override the following defaults:
|
113
119
|
|
114
|
-
* ```:parent_column_name``` to override the column name of the parent foreign key in the model's table
|
120
|
+
* ```:parent_column_name``` to override the column name of the parent foreign key in the model's table. This defaults to "parent_id".
|
115
121
|
* ```:hierarchy_table_name``` to override the hierarchy table name. This defaults to the singular name of the model + "_hierarchies".
|
116
|
-
* ```:name_column``` used by #```find_or_create_by_path```, #```find_by_path```, and ```ancestry_path``` instance methods. This is primarily useful if the model only has one required field (like a "tag").
|
117
122
|
* ```:dependent``` determines what happens when a node is destroyed. Defaults to ```nil```.
|
118
|
-
* ```
|
123
|
+
* ```:nullify``` will simply set the parent column to null. Each child node will be considered a "root" node. This is the default.
|
119
124
|
* ```:delete_all``` will delete all descendant nodes (which circumvents the destroy hooks)
|
120
125
|
* ```:destroy``` will destroy all descendant nodes (which runs the destroy hooks on each child node)
|
126
|
+
* ```:name_column``` used by #```find_or_create_by_path```, #```find_by_path```, and ```ancestry_path``` instance methods. This is primarily useful if the model only has one required field (like a "tag").
|
121
127
|
|
122
128
|
## Accessing Data
|
123
129
|
|
@@ -143,8 +149,7 @@ When you include ```acts_as_tree``` in your model, you can provide a hash to ove
|
|
143
149
|
* ``` tag.self_and_siblings``` returns an array of brothers and sisters (all at that level), including self.
|
144
150
|
* ``` tag.descendants``` returns an array of all children, childrens' children, etc., excluding self.
|
145
151
|
* ``` tag.self_and_descendants``` returns an array of all children, childrens' children, etc., including self.
|
146
|
-
* ``` tag.
|
147
|
-
* ``` tag.destroy``` will destroy a node as well as possibly all of its children. See the ```:dependent``` option passed to ```acts_as_tree```.
|
152
|
+
* ``` tag.destroy``` will destroy a node and do <em>something</em> to its children, which is determined by the ```:dependent``` option passed to ```acts_as_tree```.
|
148
153
|
|
149
154
|
## Changelog
|
150
155
|
|
@@ -152,7 +157,6 @@ When you include ```acts_as_tree``` in your model, you can provide a hash to ove
|
|
152
157
|
|
153
158
|
* Had to increment the major version, as rebuild! will need to be called by prior consumers to support the new ```leaves``` class and instance methods.
|
154
159
|
* Tag deletion is supported now along with ```:dependent => :destroy``` and ```:dependent => :delete_all```
|
155
|
-
* Added new instance method ```reparent```
|
156
160
|
* Switched from default rails plugin directory structure to rspec
|
157
161
|
|
158
162
|
## Thanks to
|
data/Rakefile
CHANGED
@@ -242,22 +242,6 @@ module ClosureTree
|
|
242
242
|
root = roots.send("find_or_create_by_#{name_column}", path.shift)
|
243
243
|
root.find_or_create_by_path(*path)
|
244
244
|
end
|
245
|
-
|
246
|
-
# From https://github.com/collectiveidea/awesome_nested_set:
|
247
|
-
def in_tenacious_transaction(&block)
|
248
|
-
retry_count = 0
|
249
|
-
begin
|
250
|
-
transaction(&block)
|
251
|
-
rescue ActiveRecord::StatementInvalid => error
|
252
|
-
raise unless connection.open_transactions.zero?
|
253
|
-
raise unless error.message =~ /Deadlock found when trying to get lock|Lock wait timeout exceeded/
|
254
|
-
raise unless retry_count < 10
|
255
|
-
retry_count += 1
|
256
|
-
logger.info "Deadlock detected on retry #{retry_count}, restarting transaction"
|
257
|
-
sleep(rand(retry_count)*0.2) # Aloha protocol
|
258
|
-
retry
|
259
|
-
end
|
260
|
-
end
|
261
245
|
end
|
262
246
|
end
|
263
247
|
|
data/lib/closure_tree/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: closure_tree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 15
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 0
|
9
9
|
- 0
|
10
|
-
|
11
|
-
- 1
|
12
|
-
version: 2.0.0.beta1
|
10
|
+
version: 2.0.0
|
13
11
|
platform: ruby
|
14
12
|
authors:
|
15
13
|
- Matthew McEachen
|
@@ -17,7 +15,7 @@ autorequire:
|
|
17
15
|
bindir: bin
|
18
16
|
cert_chain: []
|
19
17
|
|
20
|
-
date: 2011-
|
18
|
+
date: 2011-11-24 00:00:00 Z
|
21
19
|
dependencies:
|
22
20
|
- !ruby/object:Gem::Dependency
|
23
21
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
@@ -79,14 +77,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
79
77
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
78
|
none: false
|
81
79
|
requirements:
|
82
|
-
- - "
|
80
|
+
- - ">="
|
83
81
|
- !ruby/object:Gem::Version
|
84
|
-
hash:
|
82
|
+
hash: 3
|
85
83
|
segments:
|
86
|
-
-
|
87
|
-
|
88
|
-
- 1
|
89
|
-
version: 1.3.1
|
84
|
+
- 0
|
85
|
+
version: "0"
|
90
86
|
requirements: []
|
91
87
|
|
92
88
|
rubyforge_project:
|