mongoid-tree-rational 0.1.0 → 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 05a801b4f6d70f729fa1f32d6836dc5404beb672
4
+ data.tar.gz: 500f13152270fe33af60bb9536f796f790082310
5
+ SHA512:
6
+ metadata.gz: 868ea89f0264f823d4deb7046e0078a2b2b74059326dc8b477299856539ea7d265f058912eecd8160190eca5e8b434922b85b5e57d79b79f6c34e4d6d737ceaa
7
+ data.tar.gz: 72d879b3c8ac06062bde4ebfb2ddcb68e832ea517744fe8130cd1846728ffdb2a879842f686e6e007a9a85216f7897873765fcea5f61130cf59cba29aac97d52
@@ -4,9 +4,7 @@ before_install:
4
4
  language: ruby
5
5
  rvm:
6
6
  - 2.0.0
7
- - 1.9.3
8
- - 2.0.0
9
- - jruby-19mode
10
- - rbx-19mode
7
+ - 2.1.2
8
+ - rbx-2
11
9
  services:
12
10
  - mongodb
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'mongoid', ['<= 4.0', '>= 3.0']
3
+ gem 'mongoid', ['<= 5.0', '>= 4.0']
4
4
  gem 'rational_number'
5
5
 
6
6
  group :development do
@@ -12,12 +12,15 @@ group :development do
12
12
  gem 'rb-inotify', :require => false
13
13
  gem 'rb-fsevent', :require => false
14
14
  gem 'wdm', :platforms => [:mswin, :mingw], :require => false
15
- gem 'hirb'
16
- gem 'wirble'
17
15
  gem 'awesome_print'
16
+ gem 'timecop'
18
17
  end
19
18
 
20
19
  group :development, :test do
21
20
  gem 'coveralls', :require => false
22
21
  gem 'simplecov', :require => false
23
22
  end
23
+
24
+ platforms :rbx do
25
+ gem 'rubysl-rake', '~> 2.0'
26
+ end
data/README.md CHANGED
@@ -4,9 +4,10 @@ A tree structure for Mongoid documents using rational numbers and materialized p
4
4
 
5
5
  ## Requirements
6
6
 
7
- * mongoid (~> 3.0)
7
+ * mongoid (~> 4.0)
8
8
 
9
- This version will only support mongoid 3.0+
9
+ Version 2.x.x supports mongoid 4.x
10
+ Version 0.1.x supports Mongoid 3.x
10
11
 
11
12
  ## Install
12
13
 
@@ -18,7 +19,7 @@ In order to get the latest development version of mongoid-tree:
18
19
 
19
20
  gem 'mongoid-tree-rational', :git => 'git://github.com/boxcms/mongoid-tree-rational', :require => 'mongoid/tree'
20
21
 
21
- You might want to remove the `:require => 'mongoid/tree'` option and explicitly `require 'mongoid/tree'` where needed and finally run
22
+ You might want to add `:require => nil` option and explicitly `require 'mongoid/tree'` where needed and finally run
22
23
 
23
24
  bundle install
24
25
 
@@ -258,9 +259,43 @@ class Node
258
259
  end
259
260
  ```
260
261
 
262
+ ### Timestamps
263
+
264
+ Per default timestamps are only updated on the a node that is changed, and not siblings that are moved/shifted due to changes on a given node. Usually the tree position of a document does not give information about changes to the content of the document. This behaviour can be changed through the option ```auto_tree_timestamping``` .
265
+
266
+ Disable auto timestamps:
267
+
268
+ ```ruby
269
+ class Node
270
+ include Mongoid::Document
271
+ include Mongoid::Tree
272
+ include Mongoid::Tree::RationalNumbering
273
+
274
+ self.auto_tree_timestamping = false
275
+
276
+ validates_associated :parent, :children
277
+ end
278
+ ```
279
+
280
+ Enable auto timestamps: (default behaviour)
281
+
282
+ ```ruby
283
+ class Node
284
+ include Mongoid::Document
285
+ include Mongoid::Tree
286
+ include Mongoid::Tree::RationalNumbering
287
+
288
+ self.auto_tree_timestamping = false
289
+
290
+ validates_associated :parent, :children
291
+ end
292
+ ```
293
+
294
+
295
+
261
296
  ## Build Status
262
297
 
263
- mongoid-tree is on [Travis CI](http://travis-ci.org/boxcms/mongoid-tree-rational) running the specs on Ruby Head, Ruby 1.9.3, JRuby (1.9 mode), and Rubinius (1.9 mode).
298
+ mongoid-tree is on tested on [Travis CI](http://travis-ci.org/boxcms/mongoid-tree-rational) running the specs against ruby 2.0.0, ruby 2.1.2 and rbx-2
264
299
 
265
300
  ## Known issues
266
301
 
data/Rakefile CHANGED
@@ -56,8 +56,6 @@ task :default => :spec
56
56
 
57
57
  desc "Open an irb session"
58
58
  task :test_console do
59
- require 'wirble'
60
59
  require 'ap'
61
- require 'hirb'
62
60
  sh "irb -rubygems -I lib -r ./spec/spec_helper.rb"
63
61
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 2.0.0
@@ -3,7 +3,7 @@ en:
3
3
  errors:
4
4
  messages:
5
5
  tree:
6
- cyclic: "Can't be children of a descendant"
6
+ cyclic: "Can't be child of a descendant"
7
7
  search_class_mismatch: "Mismatch between search classes. Parent: %{parent_search_class} Node: %{node_search_class}"
8
8
  rational:
9
9
  incorrect_parent: "Positional values doesn't match parent (check nv/dv values)"
@@ -1,3 +1,5 @@
1
+ require 'active_support/concern'
2
+
1
3
  module Mongoid
2
4
  ##
3
5
  # = Mongoid::Tree
@@ -88,8 +90,10 @@ module Mongoid
88
90
 
89
91
  belongs_to :parent, :class_name => self.name, :inverse_of => :children, :index => true, :validate => false
90
92
 
91
- field :parent_ids, :type => Array, :default => []
93
+ field :parent_ids, type: Array, default: []
92
94
  index :parent_ids => 1
95
+ field :depth, type: Integer
96
+ index depth: 1
93
97
 
94
98
  set_callback :save, :after, :rearrange_children, :if => :rearrange_children?
95
99
  set_callback :validation, :before do
@@ -248,7 +252,7 @@ module Mongoid
248
252
  #
249
253
  # @return [Fixnum] Depth of this document
250
254
  def depth
251
- parent_ids.count
255
+ super || parent_ids.count
252
256
  end
253
257
 
254
258
  ##
@@ -273,13 +277,7 @@ module Mongoid
273
277
  #
274
278
  # @return [Mongoid::Criteria] Mongoid criteria to retrieve the documents ancestors
275
279
  def ancestors
276
- if parent_ids.any?
277
- base_class.and({
278
- '$or' => parent_ids.map { |id| { :_id => id } }
279
- })
280
- else
281
- base_class.where(:_id.in => [])
282
- end
280
+ base_class.where(:_id.in => parent_ids).order(:depth => :asc)
283
281
  end
284
282
 
285
283
  ##
@@ -428,6 +426,7 @@ module Mongoid
428
426
  else
429
427
  self.parent_ids = []
430
428
  end
429
+ self.depth = parent_ids.size
431
430
  rearrange_children! if self.parent_ids_changed?
432
431
  end
433
432
 
@@ -33,9 +33,9 @@ module Mongoid
33
33
  extend ActiveSupport::Concern
34
34
 
35
35
  included do
36
- field :position, :type => Integer
36
+ field :position, type: Integer
37
37
 
38
- default_scope asc(:position)
38
+ default_scope ->{ asc(:position) }
39
39
 
40
40
  before_save :assign_default_position, :if => :assign_default_position?
41
41
  before_save :reposition_former_siblings, :if => :sibling_reposition_required?
@@ -157,11 +157,11 @@ module Mongoid
157
157
 
158
158
  if position > other.position
159
159
  new_position = other.position
160
- self.siblings_between(other).inc(:position, 1)
161
- other.inc(:position, 1)
160
+ self.siblings_between(other).inc(position: 1)
161
+ other.inc(position: 1)
162
162
  else
163
163
  new_position = other.position - 1
164
- self.siblings_between(other).inc(:position, -1)
164
+ self.siblings_between(other).inc(position: -1)
165
165
  end
166
166
 
167
167
  self.position = new_position
@@ -181,11 +181,11 @@ module Mongoid
181
181
 
182
182
  if position > other.position
183
183
  new_position = other.position + 1
184
- self.siblings_between(other).inc(:position, 1)
184
+ self.siblings_between(other).inc(position: 1)
185
185
  else
186
186
  new_position = other.position
187
- self.siblings_between(other).inc(:position, -1)
188
- other.inc(:position, -1)
187
+ self.siblings_between(other).inc(position: -1)
188
+ other.inc(position: -1)
189
189
  end
190
190
 
191
191
  self.position = new_position
@@ -195,8 +195,8 @@ module Mongoid
195
195
  private
196
196
 
197
197
  def switch_with_sibling_at_offset(offset)
198
- siblings.where(:position => self.position + offset).first.inc(:position, -offset)
199
- inc(:position, offset)
198
+ siblings.where(position: self.position + offset).first.inc(position: -offset)
199
+ inc(position: offset)
200
200
  end
201
201
 
202
202
  def ensure_to_be_sibling_of(other)
@@ -206,14 +206,14 @@ module Mongoid
206
206
  end
207
207
 
208
208
  def move_lower_siblings_up
209
- lower_siblings.inc(:position, -1)
209
+ lower_siblings.inc(position: -1)
210
210
  end
211
211
 
212
212
  def reposition_former_siblings
213
213
  former_siblings = base_class.where(:parent_id => attribute_was('parent_id')).
214
214
  and(:position.gt => (attribute_was('position') || 0)).
215
215
  excludes(:id => self.id)
216
- former_siblings.inc(:position, -1)
216
+ former_siblings.inc(position: -1)
217
217
  end
218
218
 
219
219
  def sibling_reposition_required?
@@ -22,11 +22,11 @@ module Mongoid
22
22
  @@_disable_timestamp_count = 0
23
23
 
24
24
  included do
25
- field :rational_number_nv, :type => Integer, :default => 0
26
- field :rational_number_dv, :type => Integer, :default => 1
27
- field :rational_number_snv, :type => Integer, :default => 1
28
- field :rational_number_sdv, :type => Integer, :default => 0
29
- field :rational_number_value, :type => BigDecimal
25
+ field :rational_number_nv, type: Integer, default: 0
26
+ field :rational_number_dv, type: Integer, default: 1
27
+ field :rational_number_snv, type: Integer, default: 1
28
+ field :rational_number_sdv, type: Integer, default: 0
29
+ field :rational_number_value, type: BigDecimal
30
30
 
31
31
  validate :validate_rational_hierarchy
32
32
 
@@ -47,11 +47,35 @@ module Mongoid
47
47
 
48
48
  after_destroy :move_lower_siblings
49
49
 
50
- default_scope asc(:rational_number_value)
50
+ default_scope ->{ asc(:rational_number_value) }
51
51
 
52
52
  end # included do
53
53
 
54
54
  module ClassMethods
55
+ attr_writer :auto_tree_timestamping
56
+
57
+ def auto_tree_timestamping
58
+ @auto_tree_timestamping.nil? ? true : @auto_tree_timestamping
59
+ end
60
+
61
+ ##
62
+ # Set options for rational numbers
63
+ #
64
+ # @param [Hash] options a hash
65
+ #
66
+ # :auto_tree_timestamping (true/false)
67
+ # Per default timestamps are only updated on the a node that is changed, and not siblings that are moved/shifted
68
+ # due to changes on a given node. Usually the tree position of a document does not give information about
69
+ # changes to the content of the document. This behaviour can be changed through the option
70
+ # ':auto_tree_timestamping'.
71
+
72
+ def rational_number_options(opts)
73
+ if !opts[:auto_tree_timestamping].nil?
74
+ @auto_tree_timestamping = !!opts[:auto_tree_timestamping]
75
+ else
76
+ @auto_tree_timestamping = true
77
+ end
78
+ end
55
79
 
56
80
  # helper metods for nv/dv
57
81
 
@@ -103,7 +127,6 @@ module Mongoid
103
127
  #
104
128
  def validate_rational_hierarchy
105
129
  if self.rational_number_nv_changed? && self.rational_number_dv_changed?
106
- # puts "#{self.name} #{self.changes.inspect}"
107
130
  unless correct_rational_parent?(self.rational_number_nv, self.rational_number_dv)
108
131
  errors.add(:base, I18n.t(:cyclic, :scope => [:mongoid, :errors, :messages, :tree]))
109
132
  end
@@ -147,6 +170,10 @@ module Mongoid
147
170
 
148
171
  # shouldn't be any conflicting sibling now...
149
172
  self.from_rational_number(RationalNumber.new(nv,dv))
173
+ # if parent_id is unknown, find parent and set correct parent_id
174
+ if self.parent_id.nil? and self.rational_number.root?
175
+ # puts "!!!!!!!!! #{self.name} move_to_rational_number missing parent and NOT root rational number!"
176
+ end
150
177
  end
151
178
 
152
179
  ##
@@ -173,7 +200,7 @@ module Mongoid
173
200
  other = base_class.where(:rational_number_nv => nv).where(:rational_number_dv => dv).excludes(:id => self.id).first
174
201
  already_sibling_of = other.nil? ? false : self.sibling_of?(other)
175
202
 
176
- # puts " conflict: #{other.nil?} already_sibling_of :#{already_sibling_of}"
203
+ # puts " conflicting node: #{other.nil? ? '-' : other.name } already_sibling_of :#{already_sibling_of}"
177
204
  return false if ensure_to_have_correct_parent(nv,dv) == false
178
205
 
179
206
  move_to_rational = RationalNumber.new(nv,dv)
@@ -245,12 +272,15 @@ module Mongoid
245
272
 
246
273
  conflicting_sibling = base_class.where(:rational_number_nv => nv).where(:rational_number_dv => dv).excludes(:id => self.id).first
247
274
  if (conflicting_sibling != nil)
248
- # ensure_to_be_sibling_of(conflicting_sibling)
249
- return if conflicting_sibling.position == self.position + 1
250
- # If there are nodes between this and conflicting_sibling before move, make sure their position shifted before moving
251
- _direction = (self.position > conflicting_sibling.position ? 1 : -1)
252
- _position = (_direction < 0 ? conflicting_sibling.position + _direction : conflicting_sibling.position)
253
- shift_nodes_position(conflicting_sibling, _direction, (_direction > 0 ? false : true))
275
+ # puts "moving conflicting nodes"
276
+ without_timestamping do
277
+ # ensure_to_be_sibling_of(conflicting_sibling)
278
+ return if conflicting_sibling.position == self.position + 1
279
+ # If there are nodes between this and conflicting_sibling before move, make sure their position shifted before moving
280
+ _direction = (self.position > conflicting_sibling.position ? 1 : -1)
281
+ _position = (_direction < 0 ? conflicting_sibling.position + _direction : conflicting_sibling.position)
282
+ shift_nodes_position(conflicting_sibling, _direction, (_direction > 0 ? false : true))
283
+ end
254
284
  end
255
285
  end
256
286
 
@@ -261,6 +291,7 @@ module Mongoid
261
291
  # @return [RationalNumber] returns the rational number for the ancestor or nil for "not found"
262
292
  #
263
293
  def query_ancestor_rational_number
294
+ # puts " #{self.name} query_ancestor_rational_number parent_id: #{self.parent_id}"
264
295
  check_parent = base_class.where(:_id => self.parent_id).first
265
296
  return nil if (check_parent.nil? || check_parent == [])
266
297
  check_parent.rational_number
@@ -274,6 +305,7 @@ module Mongoid
274
305
  #
275
306
  def correct_rational_parent?(nv, dv)
276
307
  q_rational_number = query_ancestor_rational_number
308
+ # puts " #{self.name} correct_rational_parent? nv: #{nv} dv: #{dv} query_ancestor_rational_number: #{q_rational_number.inspect}"
277
309
  if q_rational_number.nil?
278
310
  if RationalNumber.new(nv,dv).parent.root?
279
311
  return true
@@ -330,37 +362,6 @@ module Mongoid
330
362
  end
331
363
  end
332
364
 
333
- ##
334
- #
335
- # Not needed, as each child gets the rational number updated after updating path?
336
- # @return [undefined]
337
- #
338
- # def children_update_rational_number
339
- # if rearrange_children?
340
- # _position = 0
341
- # # self.disable_timestamp_callback()
342
- # self.children.each do |child|
343
- # child.update_rational_number!(:position => _position)
344
- # _position += 1
345
- # end
346
- # # self.enable_timestamp_callback()
347
- # end
348
- # end
349
-
350
- ##
351
- # Enable timestamping callback if existing
352
- #
353
- def enable_timestamp_callback
354
-
355
- end
356
-
357
- ##
358
- # Disable timestamping callback if existing
359
- #
360
- def disable_timestamp_callback
361
-
362
- end
363
-
364
365
  ##
365
366
  # Convert to rational number
366
367
  #
@@ -517,29 +518,33 @@ module Mongoid
517
518
  #
518
519
  #
519
520
  def shift_nodes_position(other, direction, exclude_other = false)
520
- # puts "#{self.name} shift_nodes_position other: #{other.name} direction #{direction} exclude_other: #{exclude_other}"
521
- if exclude_other
522
- nodes_to_shift = siblings_between(other)
523
- else
524
- nodes_to_shift = siblings_between_including_other(other)
521
+ without_timestamping do
522
+ # puts "#{self.name} shift_nodes_position other: #{other.name} direction #{direction} exclude_other: #{exclude_other}"
523
+ if exclude_other
524
+ nodes_to_shift = siblings_between(other)
525
+ else
526
+ nodes_to_shift = siblings_between_including_other(other)
527
+ end
528
+ shift_nodes(nodes_to_shift, direction)
525
529
  end
526
- shift_nodes(nodes_to_shift, direction)
527
530
  end
528
531
 
529
532
  def shift_lower_nodes_from_other(other, direction)
530
- # puts "#{self.name} shift_lower_nodes_from_other other: #{other.name} direction: #{direction}"
531
- range = [other.rational_number_value, other.siblings.last.rational_number_value].sort
533
+ # puts "#{self.name} shift_lower_nodes_from_other other: #{other.name} direction: #{direction} other.siblings_and_self.count: #{other.siblings_and_self.count}"
534
+ range = [other.rational_number_value, other.siblings_and_self.last.rational_number_value].sort
532
535
  nodes_to_shift = other.siblings_and_self.where(:rational_number_value.gte => range.first, :rational_number_value.lte => range.last)
533
536
  shift_nodes(nodes_to_shift, direction)
534
537
  end
535
538
 
536
539
  def shift_nodes(nodes_to_shift, direction)
537
540
  # puts "#{self.name} shift_nodes direction: #{direction}"
538
- nodes_to_shift.each do |node_to_shift|
539
- pos = node_to_shift.position + direction
540
- # puts " shifting #{node_to_shift.name} from position #{node_to_shift.position} to #{pos}"
541
- node_to_shift.move_to_position(pos, {:force => true})
542
- node_to_shift.save_with_force_rational_numbers!
541
+ without_timestamping do
542
+ nodes_to_shift.each do |node_to_shift|
543
+ pos = node_to_shift.position + direction
544
+ # puts " shifting #{node_to_shift.name} from position #{node_to_shift.position} to #{pos}"
545
+ node_to_shift.move_to_position(pos, {:force => true})
546
+ node_to_shift.save_with_force_rational_numbers!
547
+ end
543
548
  end
544
549
  end
545
550
 
@@ -589,14 +594,29 @@ module Mongoid
589
594
  @_rational_moving_nodes = false
590
595
  end
591
596
 
597
+
598
+ ## These are only used when a document is shifted/moved because of repositioning another document.
599
+
600
+ ##
601
+ # Call block without triggeringtimestamps
602
+ # @param [&block] code block to call
603
+
604
+ def without_timestamping(&block)
605
+ # # puts "without_timestamping: Automagic timpestamping enabled? #{self.class.auto_tree_timestamping}"
606
+ disable_timestamp_callback() if self.class.auto_tree_timestamping
607
+ yield
608
+ enable_timestamp_callback() if self.class.auto_tree_timestamping
609
+ end
610
+
592
611
  ##
593
612
  # Disable the timestamps for the document type, and increase the disable count
594
613
  # Will only disable once, even if called multiple times
595
614
  #
596
615
  # @return [undefined]
597
616
  def disable_timestamp_callback
617
+ # # puts "Disabling timestamp callback count: #{@@_disable_timestamp_count}"
598
618
  if self.respond_to?("updated_at")
599
- self.class.skip_callback(:save, :before, :update_timestamps ) if @@_disable_timestamp_count == 0
619
+ self.class.skip_callback(:update, :before, :set_updated_at ) if @@_disable_timestamp_count == 0
600
620
  @@_disable_timestamp_count += 1
601
621
  end
602
622
  end
@@ -607,9 +627,10 @@ module Mongoid
607
627
  #
608
628
  # @return [undefined]
609
629
  def enable_timestamp_callback
630
+ # # puts "Enabling timestamp callback count: #{@@_disable_timestamp_count}"
610
631
  if self.respond_to?("updated_at")
611
632
  @@_disable_timestamp_count -= 1
612
- self.class.set_callback(:save, :before, :update_timestamps ) if @@_disable_timestamp_count == 0
633
+ self.class.set_callback(:update, :before, :set_updated_at ) if @@_disable_timestamp_count == 0
613
634
  end
614
635
  end
615
636
 
@@ -692,6 +713,7 @@ module Mongoid
692
713
  # save when forcing rational numbers
693
714
  #
694
715
  def save_with_force_rational_numbers!
716
+ # puts "-- Saving #{self.name} #{self.updated_at.utc}" if self.respond_to?("updated_at")
695
717
  @_forced_rational_number = true
696
718
  self.save!
697
719
  @_forced_rational_number = false
@@ -730,9 +752,11 @@ module Mongoid
730
752
  def switch_with_sibling(sibling)
731
753
  self_pos = self.position
732
754
  sibling_pos = sibling.position
733
- sibling.move_to_position(self_pos, {:force => true})
734
- self.move_to_position(sibling_pos, {:force => true})
735
- sibling.save_with_force_rational_numbers!
755
+ without_timestamping do
756
+ sibling.move_to_position(self_pos, {:force => true})
757
+ self.move_to_position(sibling_pos, {:force => true})
758
+ sibling.save_with_force_rational_numbers!
759
+ end
736
760
  self.save_with_force_rational_numbers!
737
761
  end
738
762
 
@@ -755,13 +779,18 @@ module Mongoid
755
779
  new_rational_number = RationalNumber.new(nv,dv)
756
780
  new_parent = nil
757
781
  # puts " root: #{new_rational_number.root?} #{("parent: " + self.parent.name + " nv/dv : "+ self.parent.rational_number.nv.to_s+ "/"+ self.parent.rational_number.dv.to_s) unless self.parent.nil?}#{"parent: nil" if self.parent.nil?}"
758
- if self.parent == nil
782
+ if self.parent.nil?
783
+ # puts " new_rational_number.parent == RationalNumber.new #{new_rational_number.parent == RationalNumber.new}"
759
784
  return true if new_rational_number.parent == RationalNumber.new
785
+ new_parent = base_class.where(:rational_number_nv => new_rational_number.parent.nv, :rational_number_dv => new_rational_number.parent.dv).first
760
786
  elsif new_rational_number.parent.root?
787
+ # puts " new_rational_number.parent.root? #{new_rational_number.parent.root?}"
761
788
  new_parent = nil
762
789
  else
790
+ # puts " self.parent.rational_number == new_rational_number.parent #{self.parent.rational_number == new_rational_number.parent}"
763
791
  return true if self.parent.rational_number == new_rational_number.parent
764
- new_parent = base_class.where(:rational_number_nv => new_rational_number.parent.nv, :rational_number_dv => new_rational_number.dv)
792
+ # puts " searching for parent: #{new_rational_number.parent.nv}, #{new_rational_number.parent.dv}"
793
+ new_parent = base_class.where(:rational_number_nv => new_rational_number.parent.nv, :rational_number_dv => new_rational_number.parent.dv).first
765
794
  return false if new_parent.nil? # INVALID PARENT
766
795
  end
767
796
  # If entered here, the parent needs to change
@@ -769,14 +798,13 @@ module Mongoid
769
798
  self.parent = new_parent
770
799
  end
771
800
 
772
- # FIX THESE SHIT CASE FUCK!
773
-
801
+ # Shifting/rekeying of lower siblings on destroy
774
802
  def move_lower_siblings
775
- lower_siblings.each do |sibling|
776
- disable_timestamp_callback
777
- sibling.move_to_position(sibling.position - 1)
778
- sibling.save_with_force_rational_numbers!
779
- enable_timestamp_callback
803
+ without_timestamping do
804
+ lower_siblings.each do |sibling|
805
+ sibling.move_to_position(sibling.position - 1)
806
+ sibling.save_with_force_rational_numbers!
807
+ end
780
808
  end
781
809
  end
782
810
 
@@ -791,8 +819,6 @@ module Mongoid
791
819
  # parent_id_changed? && persisted?
792
820
  # end
793
821
 
794
-
795
-
796
822
  end # RationalNumbering
797
823
  end # Tree
798
824
  end # Mongoid