Что такое миграция Rails эквивалентна «двойному» типу данных MySQL? - PullRequest
15 голосов
/ 23 июня 2010

Я не могу понять это с помощью поиска в Google.

У меня есть существующая база данных, в которой есть несколько столбцов с типом double. Что бы я написал в моей миграции rails для создания эквивалентного типа столбца? Это относительно старая база данных, и, возможно, есть более подходящий тип данных для использования полностью, но я хотел бы узнать, что думают другие.

Я собирался использовать тип :decimal, это лучший выбор?

Мысли

Ответы [ 5 ]

20 голосов
/ 17 июня 2012

В моем случае (для подготовки test-db):

MySQL (с драйвером mysql2 (0.3.11)):

double(64,12)

Rails (в db / schema.rb):

   t.float :limit=>64                    ==> failed
   t.float :limit=>53                    ==> occasionally succeeded
   t.decimal :precision=>64, :scale=>12  ==> fully succeeded
11 голосов
/ 23 июня 2010

Не существует определенного типа для double , Rails пытается быть умным по этому поводу:

В числовых (целочисленных / десятичных / плавающих) определениях столбца используется опция :limit для числабайтов в целочисленном типе столбца и опции :scale / :precision для чисел с плавающей запятой.

(точность - это число значащих цифр; масштаб - это сколько из них выпадает после десятичной точки.)

8 голосов
/ 21 февраля 2011

Вы можете получить Rails для создания DOUBLE.Я не уверен, насколько «официально» поддерживается следующее решение, но оно работает для MySQL.Просто установите ограничение на 53. Например:

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

Я получил ответ от этого сообщения в блоге , и там есть еще некоторые результаты тестирования.

5 голосов
/ 12 декабря 2011

Я вижу проблему с этим решением. Если у меня есть объявление, подобное этому:

t.float :latitude, :limit => 30

все выглядит отлично: схема базы данных показывает, что столбец объявлен как double. Проблема в том, что в schema.rb отсутствует любое: предельное значение, поэтому, когда схема клонируется в тестовую среду, столбец становится плавающим, а не двойным. Модульные тесты не пройдены, поскольку в столбце недостаточно точности.

Если вы посмотрите документы для ActiveRecord определения столбцов , то вы обнаружите следующее:

: limit - запрашивает максимальную длину столбца. Это число символы для: строка и: текстовые столбцы и количество байтов для : двоичные и: целочисленные столбцы.

В теме поплавков ничего не сказано. Из кода видно, что это побочный эффект того, как: поддерживается лимит, что это решение работает. Похоже, либо в генерации schema.rb есть ошибка, либо она никогда не предназначалась для такого использования.

Боюсь, что ответ может быть следующим: десятичный тип данных (который мне не нужен) является полностью поддерживаемым решением.

2 голосов
/ 15 февраля 2018

В современных версиях Rails (я использую 5.1)

t.column  :field, "double"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...