I consider these two options exactly the same. I prefer the first one but I'm not sure if it's better than the second option in terms of cyclomatic complexity or readability.
Assuming that this is not pure Ruby and I can call to the try
method.
existing_transaction = database.find_transaction_by_id(transaction.id)
database.create_transaction(transaction) unless existing_transaction
database.update_transaction(transaction) unless existing_transaction.try(:processed)
existing_transaction = database.find_transaction_by_id(transaction.id)
if existing_transaction
unless existing_transaction.processed
database.update_transaction(transaction)
end
else
database.create_transaction(transaction)
end