Никой от другите отговори не отстранява основната причина на въпроса.
Проблемът е, че когато Postgres повдигне изключение, то отравя бъдещи транзакции на същата връзка.
Поправката е да се върне обратно на нарушителната транзакция:
begin
ActiveRecord...do something...
rescue Exception => e
puts "SQL error in #{ __method__ }"
ActiveRecord::Base.connection.execute 'ROLLBACK'
raise e
end
Вижте справка.