awesome_nested_set 2.1.3 → 2.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ 2.1.4
2
+ * nested_set_options accept both Class & AR Relation. [Semyon Perepelitsa]
3
+ * Reduce the number of queries triggered by the canonical usage of `i.level` in the `nested_set` helpers. [thedarkone]
4
+ * Specifically require active_record [Bogdan Gusiev]
5
+ * compute_level now checks for a non nil association target. [Joel Nimety]
6
+
1
7
  2.1.3
2
8
  * Update child depth when parent node is moved. [Amanda Wagener]
3
9
  * Added move_to_child_with_index. [Ben Zhang]
@@ -1,4 +1,5 @@
1
1
  require 'awesome_nested_set/awesome_nested_set'
2
+ require 'active_record'
2
3
  ActiveRecord::Base.send :extend, CollectiveIdea::Acts::NestedSet
3
4
 
4
5
  if defined?(ActionView)
@@ -259,6 +259,16 @@ module CollectiveIdea #:nodoc:
259
259
  children.each { |c| yield(c, path.length-1) }
260
260
  end
261
261
  end
262
+
263
+ def associate_parents(objects)
264
+ id_indexed = objects.index_by(&:id)
265
+ objects.each do |object|
266
+ if !(association = object.association(:parent)).loaded? && (parent = id_indexed[object.parent_id])
267
+ association.target = parent
268
+ association.set_inverse_instance(parent)
269
+ end
270
+ end
271
+ end
262
272
  end
263
273
 
264
274
  # Any instance method that returns a collection makes use of Rails 2.1's named_scope (which is bundled for Rails 2.0), so it can be treated as a finder.
@@ -338,7 +348,7 @@ module CollectiveIdea #:nodoc:
338
348
  # Returns the level of this object in the tree
339
349
  # root level is 0
340
350
  def level
341
- parent_id.nil? ? 0 : ancestors.count
351
+ parent_id.nil? ? 0 : compute_level
342
352
  end
343
353
 
344
354
  # Returns a set of itself and all of its nested children
@@ -444,6 +454,14 @@ module CollectiveIdea #:nodoc:
444
454
  end
445
455
 
446
456
  protected
457
+ def compute_level
458
+ node, nesting = self, 0
459
+ while (association = node.association(:parent)).loaded? && association.target
460
+ nesting += 1
461
+ node = node.parent
462
+ end
463
+ node == self ? ancestors.count : node.level + nesting
464
+ end
447
465
 
448
466
  def without_self(scope)
449
467
  scope.where(["#{self.class.quoted_table_name}.#{self.class.primary_key} != ?", self])
@@ -487,7 +505,7 @@ module CollectiveIdea #:nodoc:
487
505
 
488
506
  # on creation, set automatically lft and rgt to the end of the tree
489
507
  def set_default_left_and_right
490
- highest_right_row = nested_set_scope(:order => "#{quoted_right_column_name} desc").find(:first, :limit => 1,:lock => true )
508
+ highest_right_row = nested_set_scope(:order => "#{quoted_right_column_name} desc").limit(1).lock(true).first
491
509
  maxright = highest_right_row ? (highest_right_row[right_column_name] || 0) : 0
492
510
  # adds the new node to the right of all existing nodes
493
511
  self[left_column_name] = maxright + 1
@@ -517,11 +535,8 @@ module CollectiveIdea #:nodoc:
517
535
  in_tenacious_transaction do
518
536
  reload_nested_set
519
537
  # select the rows in the model that extend past the deletion point and apply a lock
520
- self.class.base_class.find(:all,
521
- :select => "id",
522
- :conditions => ["#{quoted_left_column_name} >= ?", left],
523
- :lock => true
524
- )
538
+ nested_set_scope.where(["#{quoted_left_column_name} >= ?", left]).
539
+ select(id).lock(true)
525
540
 
526
541
  if acts_as_nested_set_options[:dependent] == :destroy
527
542
  descendants.each do |model|
@@ -529,21 +544,18 @@ module CollectiveIdea #:nodoc:
529
544
  model.destroy
530
545
  end
531
546
  else
532
- nested_set_scope.delete_all(
533
- ["#{quoted_left_column_name} > ? AND #{quoted_right_column_name} < ?",
534
- left, right]
535
- )
547
+ nested_set_scope.where(["#{quoted_left_column_name} > ? AND #{quoted_right_column_name} < ?", left, right]).
548
+ delete_all
536
549
  end
537
550
 
538
551
  # update lefts and rights for remaining nodes
539
552
  diff = right - left + 1
540
- nested_set_scope.update_all(
541
- ["#{quoted_left_column_name} = (#{quoted_left_column_name} - ?)", diff],
542
- ["#{quoted_left_column_name} > ?", right]
553
+ nested_set_scope.where(["#{quoted_left_column_name} > ?", right]).update_all(
554
+ ["#{quoted_left_column_name} = (#{quoted_left_column_name} - ?)", diff]
543
555
  )
544
- nested_set_scope.update_all(
545
- ["#{quoted_right_column_name} = (#{quoted_right_column_name} - ?)", diff],
546
- ["#{quoted_right_column_name} > ?", right]
556
+
557
+ nested_set_scope.where(["#{quoted_right_column_name} > ?", right]).update_all(
558
+ ["#{quoted_right_column_name} = (#{quoted_right_column_name} - ?)", diff]
547
559
  )
548
560
 
549
561
  # Don't allow multiple calls to destroy to corrupt the set
@@ -25,12 +25,12 @@ module CollectiveIdea #:nodoc:
25
25
  if class_or_item.is_a? Array
26
26
  items = class_or_item.reject { |e| !e.root? }
27
27
  else
28
- class_or_item = class_or_item.roots if class_or_item.is_a?(Class)
28
+ class_or_item = class_or_item.roots if class_or_item.respond_to?(:scoped)
29
29
  items = Array(class_or_item)
30
30
  end
31
31
  result = []
32
32
  items.each do |root|
33
- result += root.self_and_descendants.map do |i|
33
+ result += root.class.associate_parents(root.self_and_descendants).map do |i|
34
34
  if mover.nil? || mover.new_record? || mover.move_possible?(i)
35
35
  [yield(i), i.id]
36
36
  end
@@ -66,7 +66,7 @@ module CollectiveIdea #:nodoc:
66
66
  result = []
67
67
  children = []
68
68
  items.each do |root|
69
- root.self_and_descendants.map do |i|
69
+ root.class.associate_parents(root.self_and_descendants).map do |i|
70
70
  if mover.nil? || mover.new_record? || mover.move_possible?(i)
71
71
  if !i.leaf?
72
72
  children.sort_by! &order
@@ -1,3 +1,3 @@
1
1
  module AwesomeNestedSet
2
- VERSION = '2.1.3' unless defined?(::AwesomeNestedSet::VERSION)
2
+ VERSION = '2.1.4' 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: 2.1.3
4
+ version: 2.1.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2012-04-11 00:00:00.000000000 Z
14
+ date: 2012-08-21 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activerecord
@@ -67,7 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
67
67
  version: '0'
68
68
  requirements: []
69
69
  rubyforge_project:
70
- rubygems_version: 1.8.19
70
+ rubygems_version: 1.8.22
71
71
  signing_key:
72
72
  specification_version: 3
73
73
  summary: An awesome nested set implementation for Active Record