Nessuna delle altre risposte risolve la causa principale del problema.
Il problema è che quando Postgres solleva un'eccezione, avvelena le transazioni future sulla stessa connessione.
La soluzione è ripristinare la transazione incriminata:
begin
ActiveRecord...do something...
rescue Exception => e
puts "SQL error in #{ __method__ }"
ActiveRecord::Base.connection.execute 'ROLLBACK'
raise e
end
Vedi riferimento.