2010-06-23 7 views
14

Parece que no puedo encontrarlo buscando en Google.¿Cuál es la migración de Rails equivalente al tipo de datos 'doble' de MySQL?

Tengo una base de datos existente que tiene algunas columnas con el tipo de double, ¿qué escribiría en la migración de mis rieles para crear un tipo de columna equivalente? Es una base de datos relativamente antigua y quizás haya un tipo de datos más adecuado para usar por completo, pero quería ver lo que pensaban los demás.

Iba a utilizar el tipo de :decimal, ¿es esta la mejor opción?

¿Pensamientos?

Respuesta

10

No hay tipo específico para doble, rieles trata de ser inteligente al respecto:

La numérico (entero/decimal/float) definiciones de columna utilizan la opción :limit para el número de bytes en un tipo de columna número entero y las opciones :scale/:precision para flotadores.

(precisión es el número de dígitos significativos; escala es cuántos de estos caída después del punto decimal.)

8

, usted puede obtener rieles para crear un DOUBLE. No estoy seguro de cómo se admite "oficialmente" la siguiente solución, pero funciona para MySQL. Sólo hay que establecer el límite a 53. ej .:

t.float :published_at, :limit => 53, :null => true

Tengo la respuesta de this blog post y hay un poco más resultados de la prueba con respecto a este allí.

+0

NO trabajo para mí, el límite se elimina y no está presente en mi schema.rb (Rails 4.0) – gamov

4

Estoy viendo un problema con esta solución. Si tengo una declaración como esta:

t.float :latitude, :limit => 30 

todo parece genial: el esquema de la base de datos muestra que la columna está declarada como una doble. El problema es que schema.rb carece de cualquier: valor límite, por lo que cuando el esquema se clona en el entorno de prueba, la columna se convierte en un flotante en lugar de un doble. Las pruebas unitarias fallan porque no hay suficiente precisión en la columna.

Si nos fijamos en la documentación para ActiveRecord column definitions lo que se encuentra es la siguiente:

: Límite - Pide una longitud máxima de la columna. Este es el número de caracteres para: cadena y: columnas de texto y número de bytes para : columnas binarias y: enteras.

No dice nada sobre el tema de los flotadores. Del código se desprende que es un efecto secundario de cómo: se admite el límite de que esta solución funciona. Parece que hay un error en la generación de schema.rb o de lo contrario nunca fue pensado para ser usado de esta manera.

Me temo que la respuesta puede ser que el: tipo de datos decimal (que no me importa) es la solución totalmente compatible.

20

En mi caso (para la preparación de prueba-db):

MySQL (con mysql2 (0.3.11) conductor):

double(64,12) 

rieles (en dB/schema.rb):

t.float :limit=>64     ==> failed 
    t.float :limit=>53     ==> occasionally succeeded 
    t.decimal :precision=>64, :scale=>12 ==> fully succeeded 
1

En las versiones modernas de rieles (estoy usando 5,1)

t.column :field, "double" 
Cuestiones relacionadas