How to restart AR transaction?

http://edgeapi.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html under “Exception handling and rolling back” says that “One should restart the entire transaction if an ActiveRecord::StatementInvalid occurred.” My question is how? I tried wrapping the statements in two separate transaction block but that still doesn’t work.

I have something like:

self.transaction do
  bar = create!(params) rescue nil
end
unless bar
  self.transaction do
    bar = find_or_initialize_by(foo: foo)
    bar.update(params)
  end
end

and PG would still complain about it with “PG::Error: ERROR: current transaction is aborted, commands ignored until end of transaction block”. So my question is whether there is a proper way of restarting the transaction? Thanks!

Ken

rollback

Thanks for the reply, Scott. Can you show me how? I’ve tried per this but it still doesn’t work.

self.transaction do
bar = create(params) rescue nil

raise ActiveRecord::Rollback unless bar
end
unless bar
self.transaction do
bar = find_or_initialize_by(foo: foo)
bar.update(params)

end
end

Look at the actual SQL in the logs.