mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
Ensure Model#last doesn't affects order for another finders inside the same scope [#1499 state:resolved]
Signed-off-by: Pratik Naik <pratiknaik@gmail.com>
This commit is contained in:
@@ -1494,11 +1494,16 @@ module ActiveRecord #:nodoc:
|
||||
end
|
||||
|
||||
if scoped?(:find, :order)
|
||||
scoped_order = reverse_sql_order(scope(:find, :order))
|
||||
scoped_methods.select { |s| s[:find].update(:order => scoped_order) }
|
||||
scope = scope(:find)
|
||||
original_scoped_order = scope[:order]
|
||||
scope[:order] = reverse_sql_order(original_scoped_order)
|
||||
end
|
||||
|
||||
find_initial(options.merge({ :order => order }))
|
||||
begin
|
||||
find_initial(options.merge({ :order => order }))
|
||||
ensure
|
||||
scope[:order] = original_scoped_order if original_scoped_order
|
||||
end
|
||||
end
|
||||
|
||||
def reverse_sql_order(order_query)
|
||||
|
||||
@@ -27,6 +27,24 @@ class MethodScopingTest < ActiveRecord::TestCase
|
||||
end
|
||||
end
|
||||
|
||||
def test_scoped_find_last
|
||||
highest_salary = Developer.find(:first, :order => "salary DESC")
|
||||
|
||||
Developer.with_scope(:find => { :order => "salary" }) do
|
||||
assert_equal highest_salary, Developer.last
|
||||
end
|
||||
end
|
||||
|
||||
def test_scoped_find_last_preserves_scope
|
||||
lowest_salary = Developer.find(:first, :order => "salary ASC")
|
||||
highest_salary = Developer.find(:first, :order => "salary DESC")
|
||||
|
||||
Developer.with_scope(:find => { :order => "salary" }) do
|
||||
assert_equal highest_salary, Developer.last
|
||||
assert_equal lowest_salary, Developer.first
|
||||
end
|
||||
end
|
||||
|
||||
def test_scoped_find_combines_conditions
|
||||
Developer.with_scope(:find => { :conditions => "salary = 9000" }) do
|
||||
assert_equal developers(:poor_jamis), Developer.find(:first, :conditions => "name = 'Jamis'")
|
||||
|
||||
Reference in New Issue
Block a user