mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Make sure inner scope conditions get a preference over the outer ones
This commit is contained in:
parent
b2192888ab
commit
fe6ffce51d
5 changed files with 43 additions and 3 deletions
10
actionpack/test/fixtures/replies.yml
vendored
10
actionpack/test/fixtures/replies.yml
vendored
|
@ -12,4 +12,12 @@ another:
|
|||
developer_id: 1
|
||||
content: Nuh uh!
|
||||
created_at: <%= 1.hour.ago.to_s(:db) %>
|
||||
updated_at: nil
|
||||
updated_at: nil
|
||||
|
||||
best_reply:
|
||||
id: 3
|
||||
topic_id: 3
|
||||
developer_id: 2
|
||||
content: No one can know
|
||||
created_at: <%= 5.hours.ago.to_s(:db) %>
|
||||
updated_at: nil
|
||||
|
|
|
@ -2097,7 +2097,11 @@ module ActiveRecord #:nodoc:
|
|||
(hash[method].keys + params.keys).uniq.each do |key|
|
||||
merge = hash[method][key] && params[key] # merge if both scopes have the same key
|
||||
if key == :conditions && merge
|
||||
hash[method][key] = merge_conditions(params[key], hash[method][key])
|
||||
if params[key].is_a?(Hash) && hash[method][key].is_a?(Hash)
|
||||
hash[method][key] = merge_conditions(hash[method][key].deep_merge(params[key]))
|
||||
else
|
||||
hash[method][key] = merge_conditions(params[key], hash[method][key])
|
||||
end
|
||||
elsif key == :include && merge
|
||||
hash[method][key] = merge_includes(hash[method][key], params[key]).uniq
|
||||
elsif key == :joins && merge
|
||||
|
@ -2107,7 +2111,7 @@ module ActiveRecord #:nodoc:
|
|||
end
|
||||
end
|
||||
else
|
||||
hash[method] = params.merge(hash[method])
|
||||
hash[method] = hash[method].merge(params)
|
||||
end
|
||||
else
|
||||
hash[method] = params
|
||||
|
|
|
@ -277,6 +277,26 @@ class NamedScopeTest < ActiveRecord::TestCase
|
|||
post = Post.find(1)
|
||||
assert_equal post.comments.size, Post.scoped(:joins => join).scoped(:joins => join, :conditions => "posts.id = #{post.id}").size
|
||||
end
|
||||
|
||||
def test_chanining_should_use_latest_conditions_when_creating
|
||||
post1 = Topic.rejected.approved.new
|
||||
assert post1.approved?
|
||||
|
||||
post2 = Topic.approved.rejected.new
|
||||
assert ! post2.approved?
|
||||
end
|
||||
|
||||
def test_chanining_should_use_latest_conditions_when_searching
|
||||
# Normal hash conditions
|
||||
assert_equal Topic.all(:conditions => {:approved => true}), Topic.rejected.approved.all
|
||||
assert_equal Topic.all(:conditions => {:approved => false}), Topic.approved.rejected.all
|
||||
|
||||
# Nested hash conditions with same keys
|
||||
assert_equal [posts(:sti_comments)], Post.with_special_comments.with_very_special_comments.all
|
||||
|
||||
# Nested hash conditions with different keys
|
||||
assert_equal [posts(:sti_comments)], Post.with_special_comments.with_post(4).all.uniq
|
||||
end
|
||||
end
|
||||
|
||||
class DynamicScopeMatchTest < ActiveRecord::TestCase
|
||||
|
|
|
@ -17,6 +17,12 @@ class Post < ActiveRecord::Base
|
|||
|
||||
has_one :last_comment, :class_name => 'Comment', :order => 'id desc'
|
||||
|
||||
named_scope :with_special_comments, :joins => :comments, :conditions => {:comments => {:type => 'SpecialComment'} }
|
||||
named_scope :with_very_special_comments, :joins => :comments, :conditions => {:comments => {:type => 'VerySpecialComment'} }
|
||||
named_scope :with_post, lambda {|post_id|
|
||||
{ :joins => :comments, :conditions => {:comments => {:post_id => post_id} } }
|
||||
}
|
||||
|
||||
has_many :comments, :order => "body" do
|
||||
def find_most_recent
|
||||
find(:first, :order => "id DESC")
|
||||
|
|
|
@ -4,6 +4,8 @@ class Topic < ActiveRecord::Base
|
|||
{ :conditions => ['written_on < ?', time] }
|
||||
}
|
||||
named_scope :approved, :conditions => {:approved => true}
|
||||
named_scope :rejected, :conditions => {:approved => false}
|
||||
|
||||
named_scope :by_lifo, :conditions => {:author_name => 'lifo'}
|
||||
|
||||
named_scope :approved_as_hash_condition, :conditions => {:topics => {:approved => true}}
|
||||
|
|
Loading…
Reference in a new issue