提交 40e87ac6 编写于 作者: N Neeraj Singh 提交者: José Valim

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

with_exclusive_scope does not work properly if ARel is passed. It does 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: NJosé Valim <jose.valim@gmail.com>
上级 f8011e67
......@@ -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
......
......@@ -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
......
......@@ -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
\ No newline at end of file
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册