2010-06-23 4 views
14

Je n'arrive pas à comprendre cela en cherchant Google.Quelle est la migration de Rails équivalente au double type de données de MySQL?

J'ai une base de données existante qui a quelques colonnes avec le type de double, qu'écrirais-je dans ma migration de rails pour créer un type de colonne équivalent? C'est une base de données relativement ancienne et il y a peut-être un type de données plus approprié à utiliser complètement, mais je voulais voir ce que les autres pensaient.

J'allais utiliser le type de :decimal, est-ce le meilleur choix?

Pensées?

Répondre

10

Il n'y a pas de type spécifique pour à double, Rails essaie d'être intelligent à ce sujet:

Les définitions de colonne numérique (entier/décimal/flottant) utilisent l'option :limit pour le nombre d'octets dans un type de colonne entière et les options :scale/:precision pour les flotteurs.

(précision est le nombre de chiffres significatifs, l'échelle est le nombre de ceux-ci tombent après la virgule.)

8

Vous pouvez obtenir Rails pour créer un DOUBLE. Je ne suis pas sûr de savoir comment "officiellement" pris en charge la solution suivante est, mais cela fonctionne pour MySQL. Il suffit de fixer la limite à 53. .: par exemple

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

Je suis la réponse de this blog post et il y a encore quelques résultats des tests concernant ce là.

+0

Does not travailler pour moi, la limite est effacée et pas présent dans mon schéma.rb (Rails 4.0) – gamov

4

Je vois un problème avec cette solution. Si j'ai une déclaration comme ceci:

t.float :latitude, :limit => 30 

Tout semble très bien: le schéma de la base de données montre que la colonne est déclarée comme un double. Le problème est que schema.rb n'a aucune valeur limite, donc lorsque le schéma est cloné dans l'environnement de test, la colonne devient un flottant plutôt qu'un double. Les tests unitaires échouent car la précision de la colonne est insuffisante.

Si vous regardez la documentation pour ActiveRecord column definitions ce que vous trouvez est ceci:

: limite - demande une longueur maximale de la colonne. Nombre de caractères pour: chaîne et: colonnes de texte et nombre d'octets pour : colonnes binaires et: entiers.

Il est silencieux sur le sujet des flottants. Il apparaît du code que c'est un effet secondaire de comment: la limite est supportée que cette solution fonctionne. Il semble qu'il y ait un bug dans la génération de schema.rb ou bien il n'a jamais été prévu d'être utilisé de cette façon. Je crains que la réponse puisse être que le type de données décimal (que je ne m'inquiète pas) est la solution entièrement supportée.

20

Dans mon cas (pour la préparation de test db):

MySQL (avec mysql2 (0,3.11) conducteur):

double(64,12) 

Rails (en db/schema.rb):

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

Dans les versions modernes de Rails (j'utilise 5,1)

t.column :field, "double" 
Questions connexes