Значение по умолчанию не заполняется при миграции с Rails и Postgresql - PullRequest
6 голосов
/ 04 марта 2011

Я сейчас пытаюсь запустить эту миграцию:

class AddDroppedProjectsCountToUser < ActiveRecord::Migration
  def self.up
    add_column :users, :dropped_projects, :integer, {:default=>0, :required=>true}
  end

  def self.down
    remove_column :users, :dropped_projects
  end
end

Столбец добавлен правильно, но ни одна из старых записей не заполнена 0. Они равны нулю.Я попытался использовать default=>'0', но безрезультатно.Есть идеи, почему это может происходить?(Rails 3.0.3)


Отредактировано, чтобы добавить: Когда я создаю нового пользователя, он работает нормально, и все выглядит правильно.Это просто старые пользователи, у которых все еще есть ноль для этого значения в таблице.

Ответы [ 3 ]

12 голосов
/ 04 марта 2011

Что произойдет, если вы скажете:

def self.up
  add_column :users, :dropped_projects, :integer, :null => false, :default => 0
end

вместо?Без :null=>false вы по-прежнему допускаете NULL в dropped_projects, поэтому у PostgreSQL нет причин делать их равными 0. Кроме того, я не думаю, что :required является допустимым параметром для add_column;поскольку параметры - это просто Hash, а add_column ищет только те параметры, о которых он знает, ваш случайный параметр :required игнорируется.

3 голосов
/ 10 декабря 2012

вы можете сделать это:

(взято из http://apidock.com/rails/ActiveRecord/Migration)

Использование модели после изменения таблицы

Иногда вам может понадобиться добавитьстолбца в миграции и заполняйте его сразу после этого. В этом случае вам нужно будет вызвать Base # reset_column_information, чтобы убедиться, что модель содержит самые последние данные столбца после добавления нового столбца. Пример:

class AddPeopleSalary < ActiveRecord::Migration
  def up
    add_column :people, :salary, :integer
    Person.reset_column_information
    Person.all.each do |p|
      p.update_column :salary, SalaryCalculator.compute(p)
    end
  end
end
1 голос
/ 11 июля 2017

Я полагаю, это связано с тем, что вы меняете старую миграцию, а не создаете новую. В этом случае решение состоит в том, чтобы проверить файл схемы ( schema.rb ). Оно не меняется автоматически, а добавляется

t.integer "dropped_projects", default: 0, null: false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...