aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record
diff options
context:
space:
mode:
authorSean Griffin <sean@thoughtbot.com>2015-01-26 10:50:46 -0700
committerSean Griffin <sean@thoughtbot.com>2015-01-26 11:36:13 -0700
commit025187d9806ddfbdded15d0c7bd8341665ee40e9 (patch)
tree7af2aaa3c7e5f103e6237593b006ff3e396925c9 /activerecord/lib/active_record
parent71003d63b6e217625450b0942a7afb8d7d1d14d9 (diff)
downloadrails-025187d9806ddfbdded15d0c7bd8341665ee40e9.tar.gz
rails-025187d9806ddfbdded15d0c7bd8341665ee40e9.tar.bz2
rails-025187d9806ddfbdded15d0c7bd8341665ee40e9.zip
Move flattening records added to an association farther out
There are many ways that things end up getting passed to `concat`. Not all of those entry points called `flatten` on their input. It seems that just about every method that is meant to take a single record, or that splats its input, is meant to also take an array. `concat` is the earliest point that is common to all of the methods which add records to the association. Partially fixes #18689
Diffstat (limited to 'activerecord/lib/active_record')
-rw-r--r--activerecord/lib/active_record/associations/collection_association.rb3
1 files changed, 2 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/associations/collection_association.rb b/activerecord/lib/active_record/associations/collection_association.rb
index f2c96e9a2a..4b7591e15c 100644
--- a/activerecord/lib/active_record/associations/collection_association.rb
+++ b/activerecord/lib/active_record/associations/collection_association.rb
@@ -151,6 +151,7 @@ module ActiveRecord
# be chained. Since << flattens its argument list and inserts each record,
# +push+ and +concat+ behave identically.
def concat(*records)
+ records = records.flatten
if owner.new_record?
load_target
concat_records(records)
@@ -549,7 +550,7 @@ module ActiveRecord
def concat_records(records, should_raise = false)
result = true
- records.flatten.each do |record|
+ records.each do |record|
raise_on_type_mismatch!(record)
add_to_target(record) do |rec|
result &&= insert_record(rec, true, should_raise) unless owner.new_record?