diff --git a/lib/cancan/model_adapters/active_record_adapter.rb b/lib/cancan/model_adapters/active_record_adapter.rb index f20da17..d7d856f 100644 --- a/lib/cancan/model_adapters/active_record_adapter.rb +++ b/lib/cancan/model_adapters/active_record_adapter.rb @@ -145,8 +145,8 @@ module CanCan # Takes two hashes and does a deep merge. def merge_joins(base, add) add.each do |name, nested| - if base[name].is_a?(Hash) && !nested.empty? - merge_joins(base[name], nested) + if base[name].is_a?(Hash) + merge_joins(base[name], nested) unless nested.empty? else base[name] = nested end diff --git a/spec/cancan/model_adapters/active_record_adapter_spec.rb b/spec/cancan/model_adapters/active_record_adapter_spec.rb index ae83a89..2f1b7af 100644 --- a/spec/cancan/model_adapters/active_record_adapter_spec.rb +++ b/spec/cancan/model_adapters/active_record_adapter_spec.rb @@ -227,6 +227,12 @@ if ENV["MODEL_ADAPTER"].nil? || ENV["MODEL_ADAPTER"] == "active_record" @ability.model_adapter(Article, :read).joins.should == [:project] end + it "should merge nested and non-nested joins" do + @ability.can :read, Article, :project => { :blocked => false } + @ability.can :read, Article, :project => { :comments => { :spam => true } } + @ability.model_adapter(Article, :read).joins.should == [{:project=>[:comments]}] + end + it "should restrict articles given a MetaWhere condition" do @ability.can :read, Article, :priority.lt => 2 article1 = Article.create!(:priority => 1)