From 45b56df91b7ec95f575b7d18bfca104e8b0a2ff1 Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Wed, 22 Aug 2012 14:08:42 +0200 Subject: [PATCH] Fix default scoping merge to delay until needed --- lib/mongoid/scoping.rb | 4 ++-- spec/mongoid/scoping_spec.rb | 25 ++++++++++++++++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/lib/mongoid/scoping.rb b/lib/mongoid/scoping.rb index 8055f54e70..1c850431b7 100644 --- a/lib/mongoid/scoping.rb +++ b/lib/mongoid/scoping.rb @@ -296,8 +296,8 @@ def #{name}(*args) # # @since 3.0.5 def process_default_scope(value) - if default_scoping - default_scoping.call.merge(value.to_proc.call).to_proc + if existing = default_scoping + ->{ existing.call.merge(value.to_proc.call) } else value.to_proc end diff --git a/spec/mongoid/scoping_spec.rb b/spec/mongoid/scoping_spec.rb index 7b8a5cb23f..c64c8b6cca 100644 --- a/spec/mongoid/scoping_spec.rb +++ b/spec/mongoid/scoping_spec.rb @@ -70,23 +70,38 @@ end let(:proc_criteria) do - -> { Band.where(active: true) } + ->{ Band.where(active: true) } + end + + let(:rand_criteria) do + ->{ Band.gt(likes: rand(100)) } end before do Band.default_scope criteria Band.default_scope additional_criteria Band.default_scope proc_criteria + Band.default_scope rand_criteria end after do Band.default_scoping = nil end - it "adds the default scope to the class" do - Band.default_scoping.call.should eq( - criteria.merge(additional_criteria).merge(proc_criteria.call) - ) + it "adds the first default scope" do + Band.default_scoping.call.selector["name"].should eq("Depeche Mode") + end + + it "adds the additional default scope" do + Band.default_scoping.call.selector["origin"].should eq("England") + end + + it "adds the proc default scope" do + Band.default_scoping.call.selector["active"].should be_true + end + + it "delays execution of the merge until called" do + Band.all.selector["likes"].should_not eq(Band.all.selector["likes"]) end it "flags as being default scoped" do