From 4662528ddb6b39b99219118ac69fde4bb13de39b Mon Sep 17 00:00:00 2001 From: Bharat Gupta Date: Fri, 29 Aug 2014 20:13:28 +0530 Subject: [PATCH 1/2] Fix Issue - reset a single column when orderable_scope changed instead of removing it from list --- lib/mongoid/orderable/callbacks.rb | 10 +++-- spec/mongoid/orderable_spec.rb | 60 ++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/lib/mongoid/orderable/callbacks.rb b/lib/mongoid/orderable/callbacks.rb index 70bf4d1..367793e 100644 --- a/lib/mongoid/orderable/callbacks.rb +++ b/lib/mongoid/orderable/callbacks.rb @@ -15,14 +15,18 @@ def add_to_list def remove_from_list self.orderable_keys.each do |column| - col, pos = orderable_column(column), orderable_position(column) - MongoidOrderable.inc orderable_scoped(column).where(col.gt => pos), col, -1 + remove_position_from_list column end end + def remove_position_from_list(column) + col, pos = orderable_column(column), orderable_position(column) + MongoidOrderable.inc orderable_scoped(column).where(col.gt => pos), col, -1 + end + def apply_position column, target_position if persisted? && !embedded? && orderable_scope_changed?(column) - self.class.unscoped.find(_id).remove_from_list + self.class.unscoped.find(_id).remove_position_from_list(column) self.send("orderable_#{column}_position=", nil) end diff --git a/spec/mongoid/orderable_spec.rb b/spec/mongoid/orderable_spec.rb index ec5c19e..75a2a91 100644 --- a/spec/mongoid/orderable_spec.rb +++ b/spec/mongoid/orderable_spec.rb @@ -107,6 +107,17 @@ class MultipleColumnsOrderable orderable :column => :groups, :scope => :group end + class MultipleScopedOrderable + include Mongoid::Document + include Mongoid::Orderable + + belongs_to :apple + belongs_to :orange + + orderable :column => :posa, scope: :apple_id + orderable :column => :poso, scope: :orange_id + end + describe SimpleOrderable do before :each do @@ -1322,4 +1333,53 @@ class Apple end end + describe MultipleScopedOrderable do + before :each do + Apple.delete_all; Orange.delete_all; + MultipleScopedOrderable.delete_all + + 3.times do + Apple.create; Orange.create + end + + MultipleScopedOrderable.create! apple_id: 1, orange_id: 1 + MultipleScopedOrderable.create! apple_id: 2, orange_id: 1 + MultipleScopedOrderable.create! apple_id: 2, orange_id: 2 + MultipleScopedOrderable.create! apple_id: 1, orange_id: 3 + MultipleScopedOrderable.create! apple_id: 1, orange_id: 1 + MultipleScopedOrderable.create! apple_id: 3, orange_id: 3 + MultipleScopedOrderable.create! apple_id: 2, orange_id: 3 + MultipleScopedOrderable.create! apple_id: 3, orange_id: 2 + MultipleScopedOrderable.create! apple_id: 1, orange_id: 3 + end + + def apple_positions + MultipleScopedOrderable.order_by([:apple_id, :asc], [:posa, :asc]).map(&:posa) + end + + def orange_positions + MultipleScopedOrderable.order_by([:orange_id, :asc], [:poso, :asc]).map(&:poso) + end + + describe 'default positions' do + it { apple_positions.should == [1, 2, 3, 4, 1, 2, 3, 1, 2] } + it { orange_positions.should == [1, 2, 3, 1, 2, 1, 2, 3, 4] } + end + + describe 'change the scope of the apple' do + let(:record) { MultipleScopedOrderable.first } + before do + record.update_attribute(:apple_id, 2) + end + + it 'should properly set the apple positions' do + apple_positions.should == [1, 2, 3, 1, 2, 3, 4, 1, 2] + end + + it 'should not affect the orange positions' do + orange_positions.should == [1, 2, 3, 1, 2, 1, 2, 3, 4] + end + end + end + end From 46326bcd55bee3b8222b3712495935afa2e4a148 Mon Sep 17 00:00:00 2001 From: Bharat Gupta Date: Fri, 29 Aug 2014 20:29:16 +0530 Subject: [PATCH 2/2] Fix hash style for Ruby 1.8 --- spec/mongoid/orderable_spec.rb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/spec/mongoid/orderable_spec.rb b/spec/mongoid/orderable_spec.rb index 75a2a91..0741619 100644 --- a/spec/mongoid/orderable_spec.rb +++ b/spec/mongoid/orderable_spec.rb @@ -114,8 +114,8 @@ class MultipleScopedOrderable belongs_to :apple belongs_to :orange - orderable :column => :posa, scope: :apple_id - orderable :column => :poso, scope: :orange_id + orderable :column => :posa, :scope => :apple_id + orderable :column => :poso, :scope => :orange_id end describe SimpleOrderable do @@ -1342,15 +1342,15 @@ class Apple Apple.create; Orange.create end - MultipleScopedOrderable.create! apple_id: 1, orange_id: 1 - MultipleScopedOrderable.create! apple_id: 2, orange_id: 1 - MultipleScopedOrderable.create! apple_id: 2, orange_id: 2 - MultipleScopedOrderable.create! apple_id: 1, orange_id: 3 - MultipleScopedOrderable.create! apple_id: 1, orange_id: 1 - MultipleScopedOrderable.create! apple_id: 3, orange_id: 3 - MultipleScopedOrderable.create! apple_id: 2, orange_id: 3 - MultipleScopedOrderable.create! apple_id: 3, orange_id: 2 - MultipleScopedOrderable.create! apple_id: 1, orange_id: 3 + MultipleScopedOrderable.create! :apple_id => 1, :orange_id => 1 + MultipleScopedOrderable.create! :apple_id => 2, :orange_id => 1 + MultipleScopedOrderable.create! :apple_id => 2, :orange_id => 2 + MultipleScopedOrderable.create! :apple_id => 1, :orange_id => 3 + MultipleScopedOrderable.create! :apple_id => 1, :orange_id => 1 + MultipleScopedOrderable.create! :apple_id => 3, :orange_id => 3 + MultipleScopedOrderable.create! :apple_id => 2, :orange_id => 3 + MultipleScopedOrderable.create! :apple_id => 3, :orange_id => 2 + MultipleScopedOrderable.create! :apple_id => 1, :orange_id => 3 end def apple_positions