aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/associations/collection_association.rb
diff options
context:
space:
mode:
authorJon Leighton <j@jonathanleighton.com>2011-05-31 20:32:09 +0100
committerJon Leighton <j@jonathanleighton.com>2011-05-31 20:32:09 +0100
commitdfaad4f5a78b2e21a3b86e0daea3afb3b483dc5e (patch)
treea0235d7f4c62d9a075c6cba36d8e2b653a349fd5 /activerecord/lib/active_record/associations/collection_association.rb
parentaa316e27b7f6f17328f2be6c481f7d9ee3a92f86 (diff)
downloadrails-dfaad4f5a78b2e21a3b86e0daea3afb3b483dc5e.tar.gz
rails-dfaad4f5a78b2e21a3b86e0daea3afb3b483dc5e.tar.bz2
rails-dfaad4f5a78b2e21a3b86e0daea3afb3b483dc5e.zip
Only save the record once when calling create! on a collection association. Fixes #1360.
Diffstat (limited to 'activerecord/lib/active_record/associations/collection_association.rb')
-rw-r--r--activerecord/lib/active_record/associations/collection_association.rb40
1 files changed, 21 insertions, 19 deletions
diff --git a/activerecord/lib/active_record/associations/collection_association.rb b/activerecord/lib/active_record/associations/collection_association.rb
index d0ab6b4b86..02cc455a4e 100644
--- a/activerecord/lib/active_record/associations/collection_association.rb
+++ b/activerecord/lib/active_record/associations/collection_association.rb
@@ -104,26 +104,11 @@ module ActiveRecord
end
def create(attributes = {}, options = {}, &block)
- unless owner.persisted?
- raise ActiveRecord::RecordNotSaved, "You cannot call create unless the parent is saved"
- end
-
- if attributes.is_a?(Array)
- attributes.collect { |attr| create(attr, options, &block) }
- else
- transaction do
- add_to_target(build_record(attributes, options)) do |record|
- yield(record) if block_given?
- insert_record(record)
- end
- end
- end
+ create_record(attributes, options, &block)
end
- def create!(attrs = {}, options = {}, &block)
- record = create(attrs, options, &block)
- Array.wrap(record).each(&:save!)
- record
+ def create!(attributes = {}, options = {}, &block)
+ create_record(attributes, options, true, &block)
end
# Add +records+ to this association. Returns +self+ so method calls may be chained.
@@ -422,8 +407,25 @@ module ActiveRecord
persisted + memory
end
+ def create_record(attributes, options, raise = false, &block)
+ unless owner.persisted?
+ raise ActiveRecord::RecordNotSaved, "You cannot call create unless the parent is saved"
+ end
+
+ if attributes.is_a?(Array)
+ attributes.collect { |attr| create_record(attr, options, raise, &block) }
+ else
+ transaction do
+ add_to_target(build_record(attributes, options)) do |record|
+ yield(record) if block_given?
+ insert_record(record, true, raise)
+ end
+ end
+ end
+ end
+
# Do the relevant stuff to insert the given record into the association collection.
- def insert_record(record, validate = true)
+ def insert_record(record, validate = true, raise = false)
raise NotImplementedError
end