Ensure linting transactions don't interfere with ActiveRecord lifecycle #1790
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Our FactoryBot linting started failing for a factory despite evidence that the trait combination was producing a valid model in test. We eventually traced that down to the change made in #1726. Introducing a
ActiveRecord::Base.transactionmeant that theafter_commithooks of our model weren't running during linting.This is because of the way
ActiveRecord::Basehandles transactions. When changes are inserted for an ActiveRecord within anActiveRecord::Base.transaction, that transaction keeps a list of all the records it contains changes for. as part of the transaction committing,*_commitrecord callbacks are firedActiveRecord::Base.transactions arejoinableby default, which means thatActiveRecordcan choose to join an existing transaction instead of inserting a new one. This means that*_commits that would previously result from the object's lifecycle are not sent until the end of the linting transaction.To reinstate the previous behaviour, this PR ensures that the linting transaction is not joinable and any
*_commitcallbacks are respected.