Rails 6 `create_or_find_by`
Rails 6 comes with a new ActiveRecord
method create_or_find_by.
User.create_or_find_by(first_name: 'Vinny') do |user|
user.status = 'pending'
end
# => #<User id: 1, first_name: "Vinny", status: pending>
This method is similar to the already existing find_or_create_by
method by it tries to create the model in the database first, then if an unique constraint is raised by the DB then rails rescue the error, it rollbacks the transaction and it finally finds the model.
The idea behind to use this new method instead is to avoid race condition between a find
and a create
calls to the db.
There's a few downsides to this process, but one that caught my eyes was that now we're seeing a lot of ROLLBACK
messages in the rails logs, which is the expected behavior now.