Текущая активная запись заменяет исходную ошибку на внутреннюю, не передавая оригинал новой ошибкой. Я не могу понять, почему кто-то хотел бы этого.
Так что единственное решение прямо сейчас - это обезьяна патч;)
module ActiveRecord
module ConnectionAdapters
class AbstractAdapter
def translate_exception(e, message)
ActiveRecord::WrappedDatabaseException.new(message,e)
end
# Replaces
# def translate_exception(e, message)
# # override in derived class
# ActiveRecord::StatementInvalid.new(message)
# end
end
end
end
Теперь вы можете получить оригинальное исключение.
def self.validate_email(systemuserid, emailaddress)
begin
result = (self.find_by_sql(["SELECT fn_systemuser_validate_email(?, ?) AS returncode", systemuserid, emailaddress])).first
rescue ActiveRecord::WrappedDatabaseException => e
pgerror = e.original_exception
# Exact api depends on PG version, check the docs for your version.
puts "Doing my stuff: #{pgerror.result.result_error_message}"
end
end
Это работает с pg версии 0.11 и Rails 3.0.9. Вероятно, будет работать с более поздними версиями.