Skip to content
Browse files

with_exclusive_scope does not work properly if ARel is passed. It doe…

…s work nicely if hash is passed. Blow up if user is attempting it pass ARel to with_exclusive_scope.

[#3838 state:resolved]

Signed-off-by: José Valim <jose.valim@gmail.com>
  • Loading branch information...
1 parent f8011e6 commit 40e87ac66912b06c31c98b057a49c64f5555dd99 Neeraj Singh committed with josevalim Jun 28, 2010
View
13 activerecord/lib/active_record/base.rb
@@ -1156,7 +1156,20 @@ def with_scope(method_scoping = {}, action = :merge, &block)
end
# Works like with_scope, but discards any nested properties.
+ # TODO : this method should be deprecated in favor of standard query API
def with_exclusive_scope(method_scoping = {}, &block)
+ if method_scoping.values.any? { |e| e.is_a?(ActiveRecord::Relation) }
+ msg =<<-MSG
+ ARel can not be used with_exclusive_scope. You can either specify hash style conditions to with_exclusive_scope like this:
+ User.with_exclusive_scope {:find => :conditions => {:active => true} } do
+ end
+
+ Or you can use unscoped method instead of with_exclusive_scope like this:
+ User.unscoped.where(:active => true) do
+ end
+ MSG
+ raise ArgumentError.new(msg)
+ end
with_scope(method_scoping, :overwrite, &block)
end
View
6 activerecord/test/cases/method_scoping_test.rb
@@ -283,6 +283,12 @@ def test_replace_options
end
end
+ def test_with_exclusive_scope_with_relation
+ assert_raise(ArgumentError) do
+ Developer.all_johns
+ end
+ end
+
def test_append_conditions
Developer.send(:with_scope, :find => { :conditions => "name = 'David'" }) do
Developer.send(:with_scope, :find => { :conditions => 'salary = 80000' }) do
View
8 activerecord/test/models/developer.rb
@@ -55,6 +55,12 @@ def find_least_recent
def log=(message)
audit_logs.build :message => message
end
+
+ def self.all_johns
+ self.with_exclusive_scope :find => where(:name => 'John') do
+ self.all
+ end
+ end
end
class AuditLog < ActiveRecord::Base
@@ -103,4 +109,4 @@ class DeveloperCalledJamis < ActiveRecord::Base
class PoorDeveloperCalledJamis < ActiveRecord::Base
self.table_name = 'developers'
default_scope :conditions => { :name => 'Jamis', :salary => 50000 }
-end
+end

0 comments on commit 40e87ac

Please sign in to comment.
Something went wrong with that request. Please try again.