diff --git a/lib/cancan/model_adapters/active_record_adapter.rb b/lib/cancan/model_adapters/active_record_adapter.rb index d7d856f..6856bb7 100644 --- a/lib/cancan/model_adapters/active_record_adapter.rb +++ b/lib/cancan/model_adapters/active_record_adapter.rb @@ -66,11 +66,22 @@ module CanCan return conditions unless conditions.kind_of? Hash conditions.inject({}) do |result_hash, (name, value)| if value.kind_of? Hash + value = value.dup association_class = model_class.reflect_on_association(name).class_name.constantize - name = model_class.reflect_on_association(name).table_name.to_sym - value = tableized_conditions(value, association_class) + nested = value.inject({}) do |nested,(k,v)| + if v.kind_of? Hash + value.delete(k) + nested[k] = v + else + name = model_class.reflect_on_association(name).table_name.to_sym + result_hash[name] = value + end + nested + end + result_hash.merge!(tableized_conditions(nested,association_class)) + else + result_hash[name] = value end - result_hash[name] = value result_hash end end diff --git a/spec/cancan/model_adapters/active_record_adapter_spec.rb b/spec/cancan/model_adapters/active_record_adapter_spec.rb index a2c2809..a51774c 100644 --- a/spec/cancan/model_adapters/active_record_adapter_spec.rb +++ b/spec/cancan/model_adapters/active_record_adapter_spec.rb @@ -207,6 +207,16 @@ if ENV["MODEL_ADAPTER"].nil? || ENV["MODEL_ADAPTER"] == "active_record" @ability.model_adapter(Article, :read).conditions.should == "'t'='t'" end + it "should return appropriate sql conditions in complex case with nested joins" do + @ability.can :read, Comment, :article => { :category => { :visible => true } } + @ability.model_adapter(Comment, :read).conditions.should == { Category.table_name.to_sym => { :visible => true } } + end + + it "should return appropriate sql conditions in complex case with nested joins of different depth" do + @ability.can :read, Comment, :article => { :published => true, :category => { :visible => true } } + @ability.model_adapter(Comment, :read).conditions.should == { Article.table_name.to_sym => { :published => true }, Category.table_name.to_sym => { :visible => true } } + end + it "should not forget conditions when calling with SQL string" do @ability.can :read, Article, :published => true @ability.can :read, Article, ['secret=?', false]