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.