Что такое миграция Rails, эквивалентная двойному типу данных MySQL?
Похоже, что я не могу это понять, выполнив поиск в Google.
У меня есть существующая база данных, в которой есть несколько столбцов с типом double
, что бы я написал в моей миграции рельсов для создания эквивалентного типа столбца? Это относительно старая база данных и, возможно, более подходящий тип данных для использования полностью, но я хотел посмотреть, что другие подумали.
Я собирался использовать тип :decimal
, это лучший выбор?
Мысли?
Ответы
Ответ 1
Нет специального типа для double, Rails пытается быть умным:
В определениях столбцов numeric (integer/decimal/float) используется опция :limit
для количества байтов в типе целочисленного столбца и опций :scale
/:precision
для float.
(точность - это количество значащих цифр, масштаб - это то, сколько из них приходится на десятичную точку).
Ответ 2
В моем случае (для подготовки 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
Ответ 3
Вы можете создать Rails для создания DOUBLE
. Я не уверен, как "официально" поддерживает следующее решение, но оно работает для MySQL. Просто установите предел на 53. Например:
t.float :published_at, :limit => 53, :null => true
Я получил ответ от этого сообщения в блоге, и есть еще несколько результатов тестирования относительно этого.
Ответ 4
Я вижу проблему с этим решением. Если у меня есть такое выражение:
t.float :latitude, :limit => 30
все выглядит отлично: схема базы данных показывает, что столбец объявлен как double. Проблема в том, что в schema.rb отсутствует любое: предельное значение, поэтому при клонировании схемы в тестовую среду столбец становится плавающим, а не двойным. Модульные тесты не пройдены, поскольку в столбце недостаточно точности.
Если вы посмотрите документы для определения столбцов ActiveRecord column definitions, вы обнаружите следующее:
: limit - запрашивает максимальную длину столбца. Это число символы для: строка и: текстовые столбцы и количество байтов для: двоичные и: целочисленные столбцы.
Он молчит на тему поплавков. Из кода явствует, что это побочный эффект того, как: limit поддерживается, что это решение работает. Похоже, что в генерации schema.rb произошла ошибка, или она никогда не предназначалась для такого использования.
Боюсь, что ответом может быть то, что тип данных decimal (который мне не нужен) является полностью поддерживаемым решением.
Ответ 5
В современных версиях Rails (я использую 5.1)
t.column :field, "double"
Ответ 6
в вашей миграции:
t.decimal :amount, precision: 32, scale: 16, default: 0, null: false