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:
parent
406d3a926c
commit
4e076b03b6
4 changed files with 30 additions and 1 deletions
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Reference in a new issue