aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorBrian Christian <brchristian@gmail.com>2016-02-09 16:02:08 -0800
committerBrian Christian <brchristian@gmail.com>2016-02-09 16:02:08 -0800
commitc74045cf0771ab51dfeca94b30c447cab6193e60 (patch)
tree277b16c5e586866a7284b63ac753035a7f81dd3e /activerecord
parentb5eb2423b6e431ba53e3836d58449e7e810096b4 (diff)
downloadrails-c74045cf0771ab51dfeca94b30c447cab6193e60.tar.gz
rails-c74045cf0771ab51dfeca94b30c447cab6193e60.tar.bz2
rails-c74045cf0771ab51dfeca94b30c447cab6193e60.zip
allow Array.penultimate and Array.antepenultiate access methods
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/lib/active_record/associations/collection_association.rb8
-rw-r--r--activerecord/lib/active_record/associations/collection_proxy.rb10
-rw-r--r--activerecord/lib/active_record/querying.rb2
-rw-r--r--activerecord/lib/active_record/relation/finder_methods.rb32
-rw-r--r--activerecord/test/cases/associations/has_many_associations_test.rb10
5 files changed, 61 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/associations/collection_association.rb b/activerecord/lib/active_record/associations/collection_association.rb
index 9f2c7292ea..6927f1fca3 100644
--- a/activerecord/lib/active_record/associations/collection_association.rb
+++ b/activerecord/lib/active_record/associations/collection_association.rb
@@ -136,6 +136,14 @@ module ActiveRecord
first_nth_or_last(:forty_two, *args)
end
+ def antepenultimate(*args)
+ first_nth_or_last(:antepenultimate, *args)
+ end
+
+ def penultimate(*args)
+ first_nth_or_last(:penultimate, *args)
+ end
+
def last(*args)
first_nth_or_last(:last, *args)
end
diff --git a/activerecord/lib/active_record/associations/collection_proxy.rb b/activerecord/lib/active_record/associations/collection_proxy.rb
index fe693cfbb6..5f3d4c6735 100644
--- a/activerecord/lib/active_record/associations/collection_proxy.rb
+++ b/activerecord/lib/active_record/associations/collection_proxy.rb
@@ -197,6 +197,16 @@ module ActiveRecord
@association.forty_two(*args)
end
+ # Same as #first except returns only the third-to-last record.
+ def antepenultimate(*args)
+ @association.antepenultimate(*args)
+ end
+
+ # Same as #first except returns only the second-to-last record.
+ def penultimate(*args)
+ @association.penultimate(*args)
+ end
+
# Returns the last record, or the last +n+ records, from the collection.
# If the collection is empty, the first form returns +nil+, and the second
# form returns an empty array.
diff --git a/activerecord/lib/active_record/querying.rb b/activerecord/lib/active_record/querying.rb
index 1f429cfd94..0a82832f56 100644
--- a/activerecord/lib/active_record/querying.rb
+++ b/activerecord/lib/active_record/querying.rb
@@ -1,7 +1,7 @@
module ActiveRecord
module Querying
delegate :find, :take, :take!, :first, :first!, :last, :last!, :exists?, :any?, :many?, to: :all
- delegate :second, :second!, :third, :third!, :fourth, :fourth!, :fifth, :fifth!, :forty_two, :forty_two!, to: :all
+ delegate :second, :second!, :third, :third!, :fourth, :fourth!, :fifth, :fifth!, :forty_two, :forty_two!, :antepenultimate, :antepenultimate!, :penultimate, :penultimate!, to: :all
delegate :first_or_create, :first_or_create!, :first_or_initialize, to: :all
delegate :find_or_create_by, :find_or_create_by!, :find_or_initialize_by, to: :all
delegate :find_by, :find_by!, to: :all
diff --git a/activerecord/lib/active_record/relation/finder_methods.rb b/activerecord/lib/active_record/relation/finder_methods.rb
index d48bcea28a..90e05dc340 100644
--- a/activerecord/lib/active_record/relation/finder_methods.rb
+++ b/activerecord/lib/active_record/relation/finder_methods.rb
@@ -242,6 +242,38 @@ module ActiveRecord
find_nth! 41
end
+ # Find the third-to-last record.
+ # If no order is defined it will order by primary key.
+ #
+ # Person.antepenultimate # returns the third-to-last object fetched by SELECT * FROM people
+ # Person.offset(3).antepenultimate # returns the third-to-last object from OFFSET 3
+ # Person.where(["user_name = :u", { u: user_name }]).antepenultimate
+ def antepenultimate
+ find_nth -3
+ end
+
+ # Same as #antepenultimate but raises ActiveRecord::RecordNotFound if no record
+ # is found.
+ def antepenultimate!
+ find_nth! -3
+ end
+
+ # Find the second-to-last record.
+ # If no order is defined it will order by primary key.
+ #
+ # Person.penultimate # returns the second-to-last object fetched by SELECT * FROM people
+ # Person.offset(3).penultimate # returns the second-to-last object from OFFSET 3
+ # Person.where(["user_name = :u", { u: user_name }]).penultimate
+ def penultimate
+ find_nth -2
+ end
+
+ # Same as #penultimate but raises ActiveRecord::RecordNotFound if no record
+ # is found.
+ def penultimate!
+ find_nth! -2
+ end
+
# Returns true if a record exists in the table that matches the +id+ or
# conditions given, or false otherwise. The argument can take six forms:
#
diff --git a/activerecord/test/cases/associations/has_many_associations_test.rb b/activerecord/test/cases/associations/has_many_associations_test.rb
index ecaa521283..4e9f7c330a 100644
--- a/activerecord/test/cases/associations/has_many_associations_test.rb
+++ b/activerecord/test/cases/associations/has_many_associations_test.rb
@@ -408,6 +408,16 @@ class HasManyAssociationsTest < ActiveRecord::TestCase
end
assert_no_queries do
+ bulbs.antepenultimate()
+ bulbs.antepenultimate({})
+ end
+
+ assert_no_queries do
+ bulbs.penultimate()
+ bulbs.penultimate({})
+ end
+
+ assert_no_queries do
bulbs.last()
bulbs.last({})
end