Permalink
Browse files

Merge pull request #806 from yuszuv/support_for_nested_joins

added support for nested join conditions
  • Loading branch information...
2 parents 1cb33bd + e3ba668 commit cbd352c799182b1ba9c9f5c21afd3c8476af3ea1 @ryanb committed Feb 22, 2013
@@ -66,11 +66,22 @@ def tableized_conditions(conditions, model_class = @model_class)
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
@@ -207,6 +207,16 @@
@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]

0 comments on commit cbd352c

Please sign in to comment.