mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #29593 from kratob/master
ActiveRecord: do not create "has many through" records that have been removed
This commit is contained in:
parent
5aa510eed0
commit
a22c39e9cc
3 changed files with 24 additions and 0 deletions
|
@ -1,3 +1,11 @@
|
|||
* Previously, when building records using a `has_many :through` association,
|
||||
if the child records were deleted before the parent was saved, they would
|
||||
still be persisted. Now, if child records are deleted before the parent is saved
|
||||
on a `has_many :through` association, the child records will not be persisted.
|
||||
|
||||
*Tobias Kraze*
|
||||
|
||||
|
||||
## Rails 5.1.2 (June 26, 2017) ##
|
||||
|
||||
* Restore previous behavior of collection proxies: their values can have
|
||||
|
|
|
@ -109,6 +109,11 @@ module ActiveRecord
|
|||
record
|
||||
end
|
||||
|
||||
def remove_records(existing_records, records, method)
|
||||
super
|
||||
delete_through_records(records)
|
||||
end
|
||||
|
||||
def target_reflection_has_associated_record?
|
||||
!(through_reflection.belongs_to? && owner[through_reflection.foreign_key].blank?)
|
||||
end
|
||||
|
|
|
@ -337,6 +337,17 @@ class HasManyThroughAssociationsTest < ActiveRecord::TestCase
|
|||
assert_includes post.single_people, person
|
||||
end
|
||||
|
||||
def test_build_then_remove_then_save
|
||||
post = posts(:thinking)
|
||||
post.people.build(first_name: "Bob")
|
||||
ted = post.people.build(first_name: "Ted")
|
||||
post.people.delete(ted)
|
||||
post.save!
|
||||
post.reload
|
||||
|
||||
assert_equal ["Bob"], post.people.collect(&:first_name)
|
||||
end
|
||||
|
||||
def test_both_parent_ids_set_when_saving_new
|
||||
post = Post.new(title: "Hello", body: "world")
|
||||
person = Person.new(first_name: "Sean")
|
||||
|
|
Loading…
Reference in a new issue