added support for nested join conditions
This commit is contained in:
parent
3f4ee12025
commit
e3ba6688b5
|
@ -66,11 +66,22 @@ module CanCan
|
||||||
return conditions unless conditions.kind_of? Hash
|
return conditions unless conditions.kind_of? Hash
|
||||||
conditions.inject({}) do |result_hash, (name, value)|
|
conditions.inject({}) do |result_hash, (name, value)|
|
||||||
if value.kind_of? Hash
|
if value.kind_of? Hash
|
||||||
|
value = value.dup
|
||||||
association_class = model_class.reflect_on_association(name).class_name.constantize
|
association_class = model_class.reflect_on_association(name).class_name.constantize
|
||||||
name = model_class.reflect_on_association(name).table_name.to_sym
|
nested = value.inject({}) do |nested,(k,v)|
|
||||||
value = tableized_conditions(value, association_class)
|
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
|
end
|
||||||
result_hash[name] = value
|
|
||||||
result_hash
|
result_hash
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -207,6 +207,16 @@ if ENV["MODEL_ADAPTER"].nil? || ENV["MODEL_ADAPTER"] == "active_record"
|
||||||
@ability.model_adapter(Article, :read).conditions.should == "'t'='t'"
|
@ability.model_adapter(Article, :read).conditions.should == "'t'='t'"
|
||||||
end
|
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
|
it "should not forget conditions when calling with SQL string" do
|
||||||
@ability.can :read, Article, :published => true
|
@ability.can :read, Article, :published => true
|
||||||
@ability.can :read, Article, ['secret=?', false]
|
@ability.can :read, Article, ['secret=?', false]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user