Ninguna de las otras respuestas soluciona la causa raíz del problema.
El problema es que cuando Postgres lanza una excepción, envenena transacciones futuras en la misma conexión.
La solución es deshacer la transacción infractora:
begin
ActiveRecord...do something...
rescue Exception => e
puts "SQL error in #{ __method__ }"
ActiveRecord::Base.connection.execute 'ROLLBACK'
raise e
end
Ver referencia.