Estoy convirtiendo una aplicación de rieles de usar mysql (gema mysql2) a postgres (gema pg).connection.select_value solo devuelve cadenas en postgres con la gema de pg
con MySQL, ActiveRecord::Base.connection.select_value
llamadas valores escritos de acuerdo con los datos de retorno, por ejemplo:
> ActiveRecord::Base.connection.select_value("SELECT COUNT(*) FROM errors")
=> 86
> ActiveRecord::Base.connection.select_value("SELECT exception FROM errors where id=565")
=> "TechTalk.Genome.SqlExecutionException"
> ActiveRecord::Base.connection.select_value("SELECT id FROM errors where id=565")
=> 565
Sin embargo, con postgres, connection.select_value
siempre devuelve una cadena:
> ActiveRecord::Base.connection.select_value("SELECT COUNT(*) FROM errors")
=> "1"
> ActiveRecord::Base.connection.select_value("SELECT id FROM errors")
=> "1"
> ActiveRecord::Base.connection.select_value("SELECT source FROM errors limit 1")
=> "webapp"
Esto rompió unos cuantos unidad pruebas, y si bien estas son corregibles, estoy seguro de que tenemos otro código que depende de estos valores de retorno. ¿Hay alguna forma de obtener los valores devueltos correctamente tipados desde connection.select_value
al usar postgres?
¡La peor respuesta posible! ;) Gracias. –
"adelgace una capa lo más posible sobre el controlador nativo 'libpq'". El problema es que las asignaciones de cadenas en ruby son realmente bastante caras, parece ser un desperdicio. –
Creo que es una cuestión de circunstancias si es más inútil asignar cadenas para cada columna o intentar asignar tipos de PostgreSQL a Ruby de forma predeterminada. Si todos los tipos de columna tienen equivalentes numéricos exactos (no BigNum) en Ruby, probablemente sea un desperdicio representarlos a todos como cadenas. Sin embargo, me parece irresponsable implementar lo que solo puede ser un sistema de mapeo de tipos parcialmente completo basado en el posible desperdicio de memoria en esa circunstancia comparativamente rara. –