Permalink
Browse files

Combine scope conditions using AND

Currently Post.active.inactive will result in Post.inactive since
the last where clause wins when scopes are merged.

This pull request will merge all scopes ( barring defaul scope)
using AND.

The default scope will be overridden if another scope acts on the
same where clause.

closes #7365
  • Loading branch information...
1 parent de4a60c commit cd26b6ae7c1546ef8f38302661bbedf8cb487311 Neeraj Singh and John Leighton committed Mar 7, 2013
@@ -1,5 +1,11 @@
## Rails 4.0.0 (unreleased) ##
+* Previously `Post.active.inactive` used to result in `Post.inactive`
+ since the last where clause used to win while combining scopes.
+ Now all the scopes will be merged using `AND`. Fixes #7365 .
+
+ *Neeraj Singh* and *Jon Leighton*
+
* Expand `#cache_key` to consult all relevant updated timestamps.
Previously only `updated_at` column was checked, now it will
@@ -159,10 +159,20 @@ def scope(name, body, &block)
end
singleton_class.send(:define_method, name) do |*args|
- options = body.respond_to?(:call) ? unscoped { body.call(*args) } : body
- relation = all.merge(options)
+ if body.respond_to?(:call)
+ scope = extension ? body.call(*args).extending(extension) : body.call(*args)
- extension ? relation.extending(extension) : relation
+ if scope
+ default_scoped = scope.default_scoped
+ scope = relation.merge(scope)
+ scope.default_scoped = default_scoped
+ end
+
+ else
+ scope = body
+ end
+
+ scope || all
end
end
end
@@ -325,11 +325,11 @@ def test_chaining_should_use_latest_conditions_when_creating
def test_chaining_should_use_latest_conditions_when_searching
# Normal hash conditions
- assert_equal Topic.where(:approved => true).to_a, Topic.rejected.approved.to_a
- assert_equal Topic.where(:approved => false).to_a, Topic.approved.rejected.to_a
+ assert_equal Topic.where(approved: false).where(approved: true).to_a, Topic.rejected.approved.to_a
+ assert_equal Topic.where(approved: true).where(approved: false).to_a, Topic.approved.rejected.to_a
# Nested hash conditions with same keys
- assert_equal [posts(:sti_comments)], Post.with_special_comments.with_very_special_comments.to_a
+ assert_equal [], Post.with_special_comments.with_very_special_comments.to_a
# Nested hash conditions with different keys
assert_equal [posts(:sti_comments)], Post.with_special_comments.with_post(4).to_a.uniq

0 comments on commit cd26b6a

Please sign in to comment.