diff options
author | Nick Howard <ndh@baroquebobcat.com> | 2011-05-07 17:19:02 -0600 |
---|---|---|
committer | Jon Leighton <j@jonathanleighton.com> | 2011-05-08 23:42:53 +0100 |
commit | 92c10760d7f5e1d308e492d5fd3d551df41bfabb (patch) | |
tree | f1ff0f39e5abf0860f357778738777101af633ce /activerecord/lib/active_record | |
parent | 820b6f3da02da447dd113400edffa37927cb4579 (diff) | |
download | rails-92c10760d7f5e1d308e492d5fd3d551df41bfabb.tar.gz rails-92c10760d7f5e1d308e492d5fd3d551df41bfabb.tar.bz2 rails-92c10760d7f5e1d308e492d5fd3d551df41bfabb.zip |
Fix for #371
if a query contains a limit or an offset, ActiveRecord::FinderMethods#find_last had inconsistent behavior.
If the records were loaded, it returned the last record in the cached list.
If they were not, it reversed the order of the query and changed the limit to one.
If the earlier limit was less than the total matching the query in the db,
it would return a different record than if the records had been cached.
This commit changes find_last so that it loads the records when getting the
last record on a query containing a limit or an offset, which makes the behavior consistent.
Diffstat (limited to 'activerecord/lib/active_record')
-rw-r--r-- | activerecord/lib/active_record/relation/finder_methods.rb | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/relation/finder_methods.rb b/activerecord/lib/active_record/relation/finder_methods.rb index 57c9921ea8..32d1cff6c3 100644 --- a/activerecord/lib/active_record/relation/finder_methods.rb +++ b/activerecord/lib/active_record/relation/finder_methods.rb @@ -375,7 +375,12 @@ module ActiveRecord if loaded? @records.last else - @last ||= reverse_order.limit(1).to_a[0] + @last ||= + if offset_value || limit_value + to_a.last + else + reverse_order.limit(1).to_a[0] + end end end |