Fix an edge case with find with a list of ids, limit, and offset. Closes #8437.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6912 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
Jeremy Kemper 2007-05-31 17:15:56 +00:00
parent 0cf79f07b0
commit 8158455ded
2 changed files with 13 additions and 4 deletions

@ -1032,16 +1032,18 @@ def find_some(ids, options)
result = find_every(options)
# If the user passes in a limit to find(), we need to check
# to see if the result is limited before just checking the
# size of the results.
# Determine expected size from limit and offset, not just ids.size.
expected_size =
if options[:limit] && ids.size > options[:limit]
options[:limit]
else
ids.size
end
expected_size -= options[:offset] if options[:offset]
# 11 ids with limit 3, offset 9 should give 2 results.
if options[:offset] && (ids.size - options[:offset] < expected_size)
expected_size = ids.size - options[:offset]
end
if result.size == expected_size
result

@ -44,6 +44,13 @@ def test_find_by_ids
def test_find_by_ids_with_limit_and_offset
assert_equal 2, Entrant.find([1,3,2], :limit => 2).size
assert_equal 1, Entrant.find([1,3,2], :limit => 3, :offset => 2).size
# Also test an edge case: If you have 11 results, and you set a
# limit of 3 and offset of 9, then you should find that there
# will be only 2 results, regardless of the limit.
devs = Developer.find :all
last_devs = Developer.find devs.map(&:id), :limit => 3, :offset => 9
assert_equal 2, last_devs.size
end
def test_find_an_empty_array