1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Add ActiveRecord::Relation#extract_associated for extracting associated record (#35784)

* Add `ActiveRecord::Relation#extract_associated` for extracting associated records from a relation
This commit is contained in:
David Heinemeier Hansson 2019-03-29 16:01:45 -07:00 committed by GitHub
parent 406d3a926c
commit 4e076b03b6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 30 additions and 1 deletions

View file

@ -1,3 +1,12 @@
* Add `ActiveRecord::Relation#extract_associated` for extracting associated records from a relation.
```
account.memberships.extract_associated(:user)
# => Returns collection of User records
```
*DHH*
* Add `ActiveRecord::Relation#annotate` for adding SQL comments to its queries.
For example:

View file

@ -13,7 +13,7 @@ module ActiveRecord
:destroy_all, :delete_all, :update_all, :destroy_by, :delete_by,
:find_each, :find_in_batches, :in_batches,
:select, :reselect, :order, :reorder, :group, :limit, :offset, :joins, :left_joins, :left_outer_joins,
:where, :rewhere, :preload, :eager_load, :includes, :from, :lock, :readonly, :extending, :or,
:where, :rewhere, :preload, :extract_associated, :eager_load, :includes, :from, :lock, :readonly, :extending, :or,
:having, :create_with, :distinct, :references, :none, :unscope, :optimizer_hints, :merge, :except, :only,
:count, :average, :minimum, :maximum, :sum, :calculate, :annotate,
:pluck, :pick, :ids

View file

@ -154,6 +154,19 @@ module ActiveRecord
self
end
# Extracts a named +association+ from the relation. The named association is first preloaded,
# then the individual association records are collected from the relation. Like so:
#
# account.memberships.extract_associated(:user)
# # => Returns collection of User records
#
# This is short-hand for:
#
# account.memberships.preload(:user).collect(&:user)
def extract_associated(association)
preload(association).collect(&association)
end
# Use to indicate that the given +table_names+ are referenced by an SQL string,
# and should therefore be JOINed in any query rather than loaded separately.
# This method only works in conjunction with #includes.

View file

@ -602,6 +602,13 @@ class RelationTest < ActiveRecord::TestCase
end
end
def test_extracted_association
relation_authors = assert_queries(2) { Post.all.extract_associated(:author) }
root_authors = assert_queries(2) { Post.extract_associated(:author) }
assert_equal relation_authors, root_authors
assert_equal Post.all.collect(&:author), relation_authors
end
def test_find_with_included_associations
assert_queries(2) do
posts = Post.includes(:comments).order("posts.id")