2010-06-23 12 views
14

Non riesco a capire questo fuori cercando Google.Qual è la migrazione di Rails equivalente al "doppio" tipo di dati di MySQL?

Ho un database esistente che ha alcune colonne con il tipo di double, cosa scriverò nella mia migrazione di rotaie per creare un tipo di colonna equivalente? È un database relativamente vecchio e forse esiste un tipo di dati più adatto da utilizzare completamente, ma volevo vedere cosa pensavano gli altri.

Stavo per utilizzare il tipo di :decimal, è la scelta migliore?

Pensieri?

risposta

10

Non c'è nessun tipo specifico per doppia, rotaie cerca di essere intelligente su di esso:

La numerico (intero/decimale/galleggiante) definizioni di colonna utilizzano l'opzione :limit per il numero di byte in una colonna di tipo integer e le opzioni /:precision per i float.

(precisione è il numero di cifre significative; scala è quanti di questi caduta dopo il punto decimale.)

8

si può arrivare Rails per creare un DOUBLE. Non sono sicuro di come sia "ufficialmente" supportata la seguente soluzione, ma funziona per MySQL. Basta impostare il limite a 53. es .:

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

ho avuto la risposta da this blog post e c'è qualche più risultati di test per quanto riguarda questo c'è.

+0

non lavoro per me, il limite è spogliato e non presente nel mio schema.rb (Rails 4.0) – gamov

4

Sto riscontrando un problema con questa soluzione. Se ho una dichiarazione come questa:

t.float :latitude, :limit => 30 

tutto sembra grande: lo schema del database mostra la colonna è dichiarato come un doppio. Il problema è che schema.rb non ha alcun valore: limit, quindi quando lo schema è clonato nell'ambiente di test, la colonna diventa float anziché double. I test unitari falliscono perché non c'è abbastanza accuratezza nella colonna.

Se guardate la documentazione per ActiveRecord column definitions quello che si trova è questo:

: limite - Richieste una lunghezza massima di colonna. Questo è il numero di caratteri per: stringa e: colonne di testo e numero di byte per : binario e: colonne di numeri interi.

È silenzioso sul tema dei galleggianti. Dal codice risulta che si tratta di un effetto collaterale su come: il limite è supportato dal fatto che questa soluzione funzioni. Sembra che ci sia un bug nella generazione di schema.rb, altrimenti non è mai stato concepito per essere usato in questo modo.

Temo che la risposta potrebbe essere che il tipo di dati decimali (che non mi interessa) è la soluzione completamente supportata.

20

Nel mio caso (per la preparazione dei test-db):

MySQL (con mysql2 (0.3.11) del driver):

double(64,12) 

Rails (in dB/schema.rb):

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

Nelle versioni moderne di Rails (sto usando 5,1)

t.column :field, "double" 
Problemi correlati