Это (что я бы рассмотрел) глюк с SQLite.Эта ошибка возникает независимо от того, есть ли в таблице какие-либо записи.
При добавлении таблицы с нуля вы можете указать NOT NULL, что вы и делаете с нотацией ": null => false",Тем не менее, вы не можете сделать это при добавлении столбца.В спецификации SQLite сказано, что для этого нужно иметь значение по умолчанию, что является плохим выбором.Добавление значения по умолчанию не является опцией, потому что оно устраняет необходимость иметь внешний ключ NOT NULL, а именно целостность данных.
Вот способ обойти этот глюк, и вы можете сделать все это одним и тем жемиграция.ПРИМЕЧАНИЕ: это для случая, когда у вас еще нет записей в базе данных.
class AddDivisionIdToProfile < ActiveRecord::Migration
def self.up
add_column :profiles, :division_id, :integer
change_column :profiles, :division_id, :integer, :null => false
end
def self.down
remove_column :profiles, :division_id
end
end
Мы добавляем столбец без ограничения NOT NULL, затем немедленно изменяем столбец, чтобы добавить ограничение.Мы можем сделать это, потому что, хотя SQLite, очевидно, очень обеспокоен при добавлении столбца, он не так требователен к изменениям столбца.Это явный запах дизайна в моей книге.
Это определенно хак, но он короче нескольких миграций и все равно будет работать с более надежными базами данных SQL в вашей производственной среде.