Rails: не удается добавить: точность или масштабирование с помощью change_column при миграции?
Кажется, что это было задано раньше: десятичная точность и масштаб рельсов
Но при выполнении миграции 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"
У кого-нибудь еще есть эта проблема?
Спасибо,
Джош
Ответы
Ответ 1
Не работает для SQLite3
Для этого простого тестового приложения, которое я запускаю, у меня установлена SQLite3. По-видимому, SQLite3 не полагается на объявления типа столбца и более динамичен, смотря на содержимое столбца, а не на него:
Измените тип столбца в sqlite3
Я не тестировал его, но я уверен, почему схема не изменялась, потому что change_column
не переводится ни на что в SQLite3.
Спасибо за ответы ребятам.
Ответ 2
Имел связанную (но не такую же) проблему. Я просто менял масштаб, поэтому при изменении масштаба: вам нужна полная строка:
change_column :something, :weight, :decimal, :precision => 10, :scale => 2
omitting: decimal (который уже был) и: точность (которая уже была 10) приведет к сбою миграции.
Ответ 3
Удалить и восстановить файл db\schema.rb
.
rake db:schema:dump
Ответ 4
Взлом, но он должен получить вас туда, куда вам нужно:
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