Рельсы:Невозможно добавить параметры :precision или :scale с помощью Change_column при миграции?
-
20-09-2019 - |
Вопрос
Кажется, об этом уже спрашивали: рельсы десятичная точность и масштаб
Но при запуске change_column
миграция для :precision
или :scale
на самом деле они не влияют на схему или базу данных, но db:migrate
работает без ошибок.
Мой файл миграции выглядит так:
class ChangePrecisionAndScaleOfPaybackPeriodInTags < ActiveRecord::Migration
def self.up
change_column :tags, :payback_period, :decimal, { :scale => 3, :precision => 10 }
end
def self.down
change_column :tags, :payback_period, :decimal
end
end
Но моя схема (и данные) остается такой:
t.decimal "payback_period"
У кого-нибудь еще есть эта проблема?
Спасибо,
Джош
Решение 2
Не работает для SQLite3
Для этого простого тестового приложения, которое я запускаю, у меня есть настройка SQLite3.Видимо, SQLite3 не полагается на объявления типов столбцов. и более динамичен, вместо этого просматривая содержимое столбца - как было наткнуто здесь:
Изменить тип столбца в sqlite3
Я не проверял это, но уверен, что именно поэтому схема не менялась, потому что change_column
ничего не переводится в SQLite3.
Спасибо за ответы, ребята.
Другие советы
Была похожая (но не та же самая) проблема.Я просто менял масштаб, поэтому при изменении :scale вам понадобится полная строка:
change_column :something, :weight, :decimal, :precision => 10, :scale => 2
пропуск :decimal (который уже был) и :precision (который уже был 10) приведет к сбою миграции.
Удалить и создать заново db\schema.rb
файл.
rake db:schema:dump
Взлом, но он должен привести вас туда, куда вам нужно:
class ChangePrecisionAndScaleOfPaybackPeriodInTags < ActiveRecord::Migration
def self.up
execute "ALTER TABLE tags CHANGE payback_period DECIMAL(3,10)"
end
def self.down
change_column :tags, :payback_period, :decimal
end
end