C'est (ce que je considère être) un pépin avec SQLite. Cette erreur se produit s'il existe des enregistrements dans la table ou pas.
Lors de l'ajout d'une table à partir de zéro, vous pouvez spécifier de ne PAS NULLE, ce qui est ce que vous faites avec l' ":null => false" notation. Cependant, vous ne pouvez pas le faire lors de l'ajout d'une colonne. SQLite de la spécification indique que vous devez avoir une valeur par défaut pour ce, qui est un mauvais choix. L'ajout d'une valeur par défaut n'est pas une option, car il défait le but d'avoir un PAS NULL, foreign key - à savoir, l'intégrité des données.
Voici un moyen de contourner ce problème, et vous pouvez le faire dans la même migration. REMARQUE: c'est pour le cas où vous n'avez pas d'enregistrements dans la base de données.
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
Nous sommes l'ajout de la colonne sans la contrainte de NON nullité, puis immédiatement à modifier la colonne à ajouter la contrainte. Nous pouvons le faire parce que, tandis que SQLite est apparemment très concerné au cours d'une colonne à ajouter, il n'est pas si difficile avec des modifications de colonne. C'est un design clair odeur dans mon livre.
C'est certainement un hack, mais il est plus court que de multiples migrations et il faudra encore travailler avec les plus robustes, les bases de données SQL dans votre environnement de production.