Подтвердить что ты не робот

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"

У кого-нибудь еще есть эта проблема?

Спасибо,

Джош

4b9b3361

Ответ 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