Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fix to handle MetaWhere and non-MetaWhere conditions correctly.

  • Loading branch information...
commit c27ead5b9f734913fda2136aeaa3823fc60e2723 1 parent 0c21831
@andhapp andhapp authored
View
7 lib/cancan/model_adapters/active_record_adapter.rb
@@ -89,7 +89,12 @@ def database_records
if override_scope
@model_class.scoped.merge(override_scope)
elsif @model_class.respond_to?(:where) && @model_class.respond_to?(:joins)
- @model_class.where(conditions).joins(joins)
+ mergeable_conditions = @rules.select {|rule| rule.unmergeable? }.blank?
+ if mergeable_conditions
+ @model_class.where(conditions).joins(joins)
+ else
+ @model_class.where(*(@rules.map(&:conditions))).joins(joins)
+ end
else
@model_class.scoped(:conditions => conditions, :joins => joins)
end
View
4 lib/cancan/rule.rb
@@ -54,6 +54,10 @@ def conditions_empty?
@conditions == {} || @conditions.nil?
end
+ def unmergeable?
+ @conditions.respond_to?(:keys) && (! @conditions.keys.first.kind_of? Symbol)
+ end
+
def associations_hash(conditions = @conditions)
hash = {}
conditions.map do |name, value|
View
10 spec/cancan/model_adapters/active_record_adapter_spec.rb
@@ -236,6 +236,16 @@
@ability.should_not be_able_to(:read, article2)
end
+ it "should merge MetaWhere and non-MetaWhere conditions" do
+ @ability.can :read, Article, :priority.lt => 2
+ @ability.can :read, Article, :priority => 1
+ article1 = Article.create!(:priority => 1)
+ article2 = Article.create!(:priority => 3)
+ Article.accessible_by(@ability).should == [article1]
+ @ability.should be_able_to(:read, article1)
+ @ability.should_not be_able_to(:read, article2)
+ end
+
it "should match any MetaWhere condition" do
adapter = CanCan::ModelAdapters::ActiveRecordAdapter
article1 = Article.new(:priority => 1, :name => "Hello World")
View
7 spec/cancan/rule_spec.rb
@@ -36,4 +36,11 @@
rule = CanCan::Rule.new(true, :read, Integer, nil, nil)
rule.associations_hash.should == {}
end
+
+ it "should not be mergeable if conditions are not simple hashes" do
+ meta_where = OpenStruct.new(:name => 'metawhere', :column => 'test')
+ @conditions[meta_where] = :bar
+
+ @rule.should be_unmergeable
+ end
end
Please sign in to comment.
Something went wrong with that request. Please try again.