File tree Expand file tree Collapse file tree 3 files changed +17
-5
lines changed Expand file tree Collapse file tree 3 files changed +17
-5
lines changed Original file line number Diff line number Diff line change @@ -274,8 +274,8 @@ def create_or_find_by(attributes, &block)
274
274
with_connection do |connection |
275
275
record = nil
276
276
transaction ( requires_new : true ) do
277
- record = new ( attributes , &block )
278
- record . save || raise ( ActiveRecord ::Rollback )
277
+ record = create ( attributes , &block )
278
+ record . _last_transaction_return_status || raise ( ActiveRecord ::Rollback )
279
279
end
280
280
record
281
281
rescue ActiveRecord ::RecordNotUnique
@@ -294,8 +294,8 @@ def create_or_find_by!(attributes, &block)
294
294
with_connection do |connection |
295
295
record = nil
296
296
transaction ( requires_new : true ) do
297
- record = new ( attributes , &block )
298
- record . save! || raise ( ActiveRecord ::Rollback )
297
+ record = create! ( attributes , &block )
298
+ record . _last_transaction_return_status || raise ( ActiveRecord ::Rollback )
299
299
end
300
300
record
301
301
rescue ActiveRecord ::RecordNotUnique
Original file line number Diff line number Diff line change @@ -13,7 +13,7 @@ module Transactions
13
13
scope : [ :kind , :name ]
14
14
end
15
15
16
- attr_accessor :_new_record_before_last_commit # :nodoc:
16
+ attr_accessor :_new_record_before_last_commit , :_last_transaction_return_status # :nodoc:
17
17
18
18
# = Active Record \Transactions
19
19
#
@@ -436,6 +436,7 @@ def with_transaction_returning_status
436
436
status = yield
437
437
raise ActiveRecord ::Rollback unless status
438
438
end
439
+ @_last_transaction_return_status = status
439
440
status
440
441
end
441
442
end
@@ -451,6 +452,7 @@ def trigger_transactional_callbacks? # :nodoc:
451
452
def init_internals
452
453
super
453
454
@_start_transaction_state = nil
455
+ @_last_transaction_status = nil
454
456
@_committed_already_called = nil
455
457
@_new_record_before_last_commit = nil
456
458
end
Original file line number Diff line number Diff line change 26
26
require "models/category"
27
27
require "models/categorization"
28
28
require "models/edge"
29
+ require "models/wheel"
29
30
require "models/subscriber"
30
31
require "models/cpk"
31
32
@@ -1611,6 +1612,15 @@ def test_create_or_find_by_bang_rollbacks_a_transaction
1611
1612
end
1612
1613
end
1613
1614
1615
+ def test_create_or_find_by_on_a_collections_rollbacks_a_transaction_when_owner_is_not_persisted
1616
+ car = BrokenCar . create ( name : "Civic" )
1617
+ assert_not_predicate ( car , :persisted? )
1618
+
1619
+ assert_raises ( ActiveRecord ::RecordNotSaved ) do
1620
+ car . wheels . create_or_find_by! ( size : 1500 )
1621
+ end
1622
+ end
1623
+
1614
1624
def test_create_or_find_by_with_block
1615
1625
assert_nil Subscriber . find_by ( nick : "bob" )
1616
1626
You can’t perform that action at this time.
0 commit comments