Aucune des autres réponses ne corrige la cause première du problème.
Le problème est que lorsque Postgres lève une exception, il empoisonne les futures transactions sur la même connexion.
La solution consiste à annuler la transaction incriminée :
begin
ActiveRecord...do something...
rescue Exception => e
puts "SQL error in #{ __method__ }"
ActiveRecord::Base.connection.execute 'ROLLBACK'
raise e
end
Voir référence.