Comment faire pour modifier une colonne nullable de ne pas accepter les valeurs null dans les Rails de la migration?
J'ai créé une colonne de date dans un précédent migration et le configurer pour accepter les valeurs null. Maintenant, je veux le changer pour ne pas être nullable. Comment puis-je faire, sachant qu'il y sont des lignes de valeur null dans la base de données? Je suis d'accord avec la définition de ces colonnes à la Fois.maintenant, si ils sont actuellement nulle.
Vous devez vous connecter pour publier un commentaire.
Si vous le faites dans une migration alors que vous pourriez probablement faire comme ceci:
MyModel.update_all({:date_column => Time.now}, {:date_column => nil})
. La requête dans votre forme d'origine juste fait tous mes modèles ont aucune valeur dans le champ.change
méthode n'est pas tellement adapté à ce cas, parce que (1) laupdate_all
méthode sera exécutée sur les deux migrer et un potentiel de revenir. Qui pourrait ne pas être la pire chose, mais parce que (2) la migration a aucun moyen de savoir ce que la colonne a été modifié à partir d'un potentiel de revenir. Donc, pour ce cas, je m'en tiendrais àup
etdown
.MyModel.update_all({:date_column => Time.now}, {:date_column => nil})
à un fichier de migration?date_column
tous ontNOT NULL
valeurs, de sorte que leupdate_all
instruction de ne rien faire. Ainsi, unchange
bloc est très bien.Dans les Rails 4, c'est mieux (sèche-linge) solution:
Pour assurer les documents n'existent pas avec
NULL
les valeurs de cette colonne, vous pouvez passer d'un quatrième paramètre, qui est la valeur par défaut à utiliser pour les enregistrements avecNULL
valeurs:change_column_null
. Cependant Rick Smith commentaire ci-dessus montre une très valide.Rails 4 (d'autres Rails 4 réponses ont des problèmes):
La modification d'une colonne avec des valeurs NULL pour ne pas autoriser les valeurs NULL de causer des problèmes. C'est exactement le genre de code qui fonctionnera dans votre programme d'installation, puis se bloquer lorsque vous essayez de déployer à votre VIVRE de production. Vous devez d'abord changer les valeurs NULL pour quelque chose de valable et puis interdire les valeurs Null. La 4ème valeur dans
change_column_null
est exactement ce que fait. Voir la documentation pour plus de détails.Aussi, en général, je préfère définir une valeur par défaut pour le champ de sorte que je ne pas besoin de spécifier la valeur du champ à chaque fois que je créer un nouvel objet. J'ai inclus le commentaire sur le code pour le faire.
add_column :users, :admin, :string
puischange_column_null(:admin, :string, false, "new_value_for_existing_records")
Créer une migration qui a un
change_column
déclaration avec un:default =>
valeur.Voir: change_column
Selon le moteur de base de données, vous devrez utiliser les
change_column_null
change_column_null
.Rails 4:
Dans Rails 4.02+ selon la docs il n'existe pas de méthode comme
update_all
avec 2 arguments. Au lieu de cela on peut utiliser ce code:Vous ne pouvez pas utiliser add_timestamps et nuls:faux, si vous avez des documents existants, voici donc la solution :