awesome_nested_set 3.0.2 → 3.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8f8c65ecba7e654a2e914de64f646e5e43416e47
4
- data.tar.gz: c9d4bda2db60143062026f576080982698fa73ff
3
+ metadata.gz: f5ab643ea1dfe98a3df89d5bf2c142fd22d8d96f
4
+ data.tar.gz: 3f6089e375d849c9cb600eb4c776c40323b3e67e
5
5
  SHA512:
6
- metadata.gz: 98ecf4b03fd84f510f84092fe197c73b8a6612dfd80444d9c4dd79d49bdfb3f0ebb4f47966f6ce5e02aadb9006682f1d5fc5cb9c6654682fff286d0585ec1dc1
7
- data.tar.gz: efc4897f020894d3798c6c00782baa3de7409d14f02890608da4f8245f4dfc59708ac6771efe2f1667b8b9f324c78fb3705ddee1b7df3b8d403bbdb13298f6ba
6
+ metadata.gz: 3afe6283157bd9937196de7ffe4239dac7be930417b505b306c92685cfdd703d9cf7463317994bc822490f4a426c0c88f3f3425501036cd00b00025a6f81dc8c
7
+ data.tar.gz: d96cf10ce68aa34ccee951f3b04beec6eebd960748c42502ba48016b3f559cf798c657b2b9b36d4238c38d1ba0dbca08f53dab5f39f3d3bb37044dcb4dafe902
data/CHANGELOG CHANGED
@@ -1,3 +1,10 @@
1
+ 3.0.4
2
+ * Reuse the current model's connection when available [Tim Bugai] [#322](https://github.com/collectiveidea/awesome_nested_set/pull/322)
3
+
4
+ 3.0.3
5
+ * Add :nullify option to :dependent functionality to orphan children rather
6
+ than destroy them.
7
+
1
8
  3.0.2
2
9
  * Fix `dependent: :restrict_with_exception` not allowing a delete to occur. [Brendan Kilfoil]
3
10
  * Replace `Arel::SelectManager#join_sql` with `Arel::SelectManager#join_sources` as `Arel::Node#joins` accepts AST as well. [Swanand Pagnis]
data/README.md CHANGED
@@ -35,10 +35,10 @@ class CreateCategories < ActiveRecord::Migration
35
35
  t.integer :parent_id, :null => true, :index => true
36
36
  t.integer :lft, :null => false, :index => true
37
37
  t.integer :rgt, :null => false, :index => true
38
-
38
+
39
39
  # optional fields
40
- t.integer :depth, :null => false
41
- t.integer :children_count, :null => false
40
+ t.integer :depth, :null => false, :default => 0
41
+ t.integer :children_count, :null => false, :default => 0
42
42
  end
43
43
  end
44
44
 
@@ -63,13 +63,14 @@ Run `rake rdoc` to generate the API docs and see [CollectiveIdea::Acts::NestedSe
63
63
  You can pass various options to `acts_as_nested_set` macro. Configuration options are:
64
64
 
65
65
  * `parent_column`: specifies the column name to use for keeping the position integer (default: parent_id)
66
- * `left_column`: column name for left boundry data (default: lft)
67
- * `right_column`: column name for right boundry data (default: rgt)
66
+ * `left_column`: column name for left boundary data (default: lft)
67
+ * `right_column`: column name for right boundary data (default: rgt)
68
68
  * `depth_column`: column name for the depth data default (default: depth)
69
69
  * `scope`: restricts what is to be considered a list. Given a symbol, it'll attach “_id” (if it hasn't been already) and use that as the foreign key restriction. You can also pass an array to scope by multiple attributes. Example: `acts_as_nested_set :scope => [:notable_id, :notable_type]`
70
- * `dependent`: behavior for cascading destroy. If set to :destroy, all the child objects are destroyed alongside this object by calling their destroy method. If set to :delete_all (default), all the child objects are deleted without calling their destroy method.
70
+ * `dependent`: behavior for cascading destroy. If set to :destroy, all the child objects are destroyed alongside this object by calling their destroy method. If set to :delete_all (default), all the child objects are deleted without calling their destroy method. If set to :nullify, all child objects will become orphaned and become roots themselves.
71
71
  * `counter_cache`: adds a counter cache for the number of children. defaults to false. Example: `acts_as_nested_set :counter_cache => :children_count`
72
72
  * `order_column`: on which column to do sorting, by default it is the left_column_name. Example: `acts_as_nested_set :order_column => :position`
73
+ * `touch`: If set to `true`, then the updated_at timestamp on the ancestors will be set to the current time whenever this object is saved or destroyed (default: false)
73
74
 
74
75
  See [CollectiveIdea::Acts::NestedSet::Model::ClassMethods](/lib/awesome_nested_set/model.rb#L26) for a list of class methods and [CollectiveIdea::Acts::NestedSet::Model](lib/awesome_nested_set/model.rb#L13) for a list of instance methods added to acts_as_nested_set models
75
76
 
@@ -157,7 +158,7 @@ end
157
158
 
158
159
  To make use of `awesome_nested_set`, your model needs to have 3 fields:
159
160
  `lft`, `rgt`, and `parent_id`. The names of these fields are configurable.
160
- You can also have an optional field, `depth`.
161
+ You can also have optional fields, `depth` and `children_count`.
161
162
 
162
163
  Create a migration to add fields:
163
164
 
@@ -167,9 +168,12 @@ class AddNestedToCategories < ActiveRecord::Migration
167
168
  def self.up
168
169
  add_column :categories, :parent_id, :integer # Comment this line if your project already has this column
169
170
  # Category.where(parent_id: 0).update_all(parent_id: nil) # Uncomment this line if your project already has :parent_id
170
- add_column :categories, :lft , :integer
171
- add_column :categories, :rgt , :integer
172
- add_column :categories, :depth , :integer # this is optional.
171
+ add_column :categories, :lft, :integer
172
+ add_column :categories, :rgt, :integer
173
+
174
+ # optional fields
175
+ add_column :categories, :depth, :integer
176
+ add_column :categories, :children_count, :integer
173
177
 
174
178
  # This is necessary to update :lft and :rgt columns
175
179
  Category.rebuild!
@@ -179,7 +183,10 @@ class AddNestedToCategories < ActiveRecord::Migration
179
183
  remove_column :categories, :parent_id
180
184
  remove_column :categories, :lft
181
185
  remove_column :categories, :rgt
182
- remove_column :categories, :depth # this is optional.
186
+
187
+ # optional fields
188
+ remove_column :categories, :depth
189
+ remove_column :categories, :children_count
183
190
  end
184
191
 
185
192
  end
@@ -206,6 +213,8 @@ Category.rebuild!
206
213
 
207
214
  Your tree will be converted to a valid nested set. Awesome!
208
215
 
216
+ Note: You can use `Category.rebuild!(false)` to skip model validations when performing the rebuild.
217
+
209
218
  ## View Helper
210
219
 
211
220
  The view helper is called #nested_set_options.
@@ -87,7 +87,7 @@ module CollectiveIdea #:nodoc:
87
87
  ) if acts_as_nested_set_options[ar_callback]
88
88
  end
89
89
 
90
- has_many :children, -> { order(quoted_order_column_name) },
90
+ has_many :children, -> { order(quoted_order_column_full_name) },
91
91
  has_many_children_options
92
92
  end
93
93
 
@@ -32,23 +32,23 @@ module CollectiveIdea #:nodoc:
32
32
  end
33
33
 
34
34
  def quoted_left_column_name
35
- ActiveRecord::Base.connection.quote_column_name(left_column_name)
35
+ model_connection.quote_column_name(left_column_name)
36
36
  end
37
37
 
38
38
  def quoted_right_column_name
39
- ActiveRecord::Base.connection.quote_column_name(right_column_name)
39
+ model_connection.quote_column_name(right_column_name)
40
40
  end
41
41
 
42
42
  def quoted_depth_column_name
43
- ActiveRecord::Base.connection.quote_column_name(depth_column_name)
43
+ model_connection.quote_column_name(depth_column_name)
44
44
  end
45
45
 
46
46
  def quoted_primary_column_name
47
- ActiveRecord::Base.connection.quote_column_name(primary_column_name)
47
+ model_connection.quote_column_name(primary_column_name)
48
48
  end
49
49
 
50
50
  def quoted_parent_column_name
51
- ActiveRecord::Base.connection.quote_column_name(parent_column_name)
51
+ model_connection.quote_column_name(parent_column_name)
52
52
  end
53
53
 
54
54
  def quoted_scope_column_names
@@ -56,7 +56,7 @@ module CollectiveIdea #:nodoc:
56
56
  end
57
57
 
58
58
  def quoted_order_column_name
59
- ActiveRecord::Base.connection.quote_column_name(order_column)
59
+ model_connection.quote_column_name(order_column)
60
60
  end
61
61
 
62
62
  def quoted_primary_key_column_full_name
@@ -78,6 +78,10 @@ module CollectiveIdea #:nodoc:
78
78
  def quoted_parent_column_full_name
79
79
  "#{quoted_table_name}.#{quoted_parent_column_name}"
80
80
  end
81
+
82
+ def model_connection
83
+ self.is_a?(Class) ? self.connection : self.class.connection
84
+ end
81
85
  end
82
86
  end
83
87
  end
@@ -51,7 +51,9 @@ module CollectiveIdea #:nodoc:
51
51
  return false
52
52
  end
53
53
  return true
54
- else
54
+ elsif acts_as_nested_set_options[:dependent] == :nullify
55
+ descendants.update_all(parent_id: nil)
56
+ else
55
57
  descendants.delete_all
56
58
  end
57
59
  end
@@ -3,16 +3,23 @@ module CollectiveIdea #:nodoc:
3
3
  module NestedSet #:nodoc:
4
4
  module Model
5
5
  module Transactable
6
+ class OpenTransactionsIsNotZero < ActiveRecord::StatementInvalid
7
+ end
8
+
9
+ class DeadlockDetected < ActiveRecord::StatementInvalid
10
+ end
6
11
 
7
12
  protected
8
13
  def in_tenacious_transaction(&block)
9
14
  retry_count = 0
10
15
  begin
11
16
  transaction(&block)
17
+ rescue CollectiveIdea::Acts::NestedSet::Move::ImpossibleMove
18
+ raise
12
19
  rescue ActiveRecord::StatementInvalid => error
13
- raise unless self.class.connection.open_transactions.zero?
20
+ raise OpenTransactionsIsNotZero.new(error.message) unless connection.open_transactions.zero?
14
21
  raise unless error.message =~ /[Dd]eadlock|Lock wait timeout exceeded/
15
- raise unless retry_count < 10
22
+ raise DeadlockDetected.new(error.message) unless retry_count < 10
16
23
  retry_count += 1
17
24
  logger.info "Deadlock detected on retry #{retry_count}, restarting transaction"
18
25
  sleep(rand(retry_count)*0.1) # Aloha protocol
@@ -110,9 +110,12 @@ module CollectiveIdea #:nodoc:
110
110
  [bound, other_bound]
111
111
  end
112
112
 
113
+ class ImpossibleMove < ActiveRecord::StatementInvalid
114
+ end
115
+
113
116
  def prevent_impossible_move
114
117
  if !root && !instance.move_possible?(target)
115
- raise ActiveRecord::ActiveRecordError, "Impossible move, target node cannot be inside moved tree."
118
+ raise ImpossibleMove, "Impossible move, target node cannot be inside moved tree."
116
119
  end
117
120
  end
118
121
 
@@ -1,3 +1,3 @@
1
1
  module AwesomeNestedSet
2
- VERSION = '3.0.2' unless defined?(::AwesomeNestedSet::VERSION)
2
+ VERSION = '3.0.3' unless defined?(::AwesomeNestedSet::VERSION)
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: awesome_nested_set
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.2
4
+ version: 3.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Keepers
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-01-08 00:00:00.000000000 Z
13
+ date: 2016-01-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -130,7 +130,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
130
130
  requirements:
131
131
  - - ">="
132
132
  - !ruby/object:Gem::Version
133
- version: '0'
133
+ version: 1.9.3
134
134
  required_rubygems_version: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - ">="
@@ -138,9 +138,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
138
  version: '0'
139
139
  requirements: []
140
140
  rubyforge_project:
141
- rubygems_version: 2.4.5
141
+ rubygems_version: 2.5.1
142
142
  signing_key:
143
143
  specification_version: 4
144
144
  summary: An awesome nested set implementation for Active Record
145
145
  test_files: []
146
- has_rdoc: