2011-05-15 30 views
9

Tengo un error extraño en una de mis aplicaciones.Rails 3 y guardar valores decimales de un formulario

Cuando estoy usando la base de datos sqlite3 el error no está presente. Sin embargo, cuando uso mysql2 como el adaptador de base de datos, experimento un error al guardar valores decimales de un formulario.

Si presento el valor 19.99 mi entrada después de retirar el decimal y se almacena en la base de datos como 19.00

Qué podría causar esto? La base de datos tiene la configuración correcta para la columna y puedo crear un registro correcto usando la consola de rieles.

Editar: Dicho entero cuando realmente quería decir decimal.

+0

es el valor que se guarden correctamente en el mesa de mysql? – Zabba

+0

No, se envía a mysql correctamente por lo que puedo ver en los registros de rieles. Voy a ver si puedo editar mis migraciones nuevamente con la solución de sscirrus en mente y me aseguro de que todo sea correcto. –

Respuesta

14

creo que podría ser una de estas posibilidades:

  1. Una validación en su modelo de carriles (o algún paso en su controlador) está fijando el valor a un número entero, o al menos truncando los decimales, antes de guardar en la base de datos. Para ver si este es el caso, comprobar su funcionamiento INSERT en sus registros y ver lo que los carriles de datos se tratando poner en.

  2. Si Carriles es el envío de 19.99 en lugar de 19.00, lo más probable es que tiene una pequeña discrepancia entre tipos de datos en sus dos bases de datos. Compruebe si su base de datos MySQL simplemente no almacena el decimal con una escala de 2 o superior. MySQL almacena por defecto los tipos de datos con una precisión de 10 y una escala de 0, por lo que NO almacena decimales.

Si # 2 es el problema, la solución es generar una migración y el 'cambio' el tipo de campo para especificar una escala, algo así como:

# 'up' portion of a new migration 
def self.up 
    change_column :mymodel, :myfield, :decimal, :precision => 6, :scale => 2 
end 
+0

Gracias! Me salvaste de arrancarme el pelo por esto. Debo haber tenido un error tipográfico en mi migración o simplemente no haber revisado algo tan completamente como debería haberlo hecho. La solución fue agregar: precisión => 6,: escala => 2 al final de la definición de columna en mis migraciones. –

+0

@DevinM: ¡eres bienvenido! – sscirrus

+1

Si tiene varias columnas para cambiar en la misma tabla, es posible que también desee esta otra sintaxis: change_table: mymodel do | t | t.change: myfield,: decimal,: precision => 6,: scale => 2 –

Cuestiones relacionadas