Comment faire pour modifier une colonne nullable à non nullable dans une migration Rails?

J’ai créé une colonne de date dans une migration précédente et définissez-la comme étant nullable. Maintenant je veux le changer pour qu’il ne soit pas nullable. Comment puis-je faire cela en supposant qu’il y a des lignes nulles dans cette firebase database? Je suis d’accord pour définir ces colonnes sur Time.now si elles sont actuellement nulles.

Si vous le faites dans une migration, vous pourriez probablement le faire comme ceci:

# Make sure no null value exist MyModel.where(date_column: nil).update_all(date_column: Time.now) # Change the column to not allow null change_column :my_models, :date_column, :datetime, null: false 

Dans Rails 4, c’est une meilleure solution (DRY):

 change_column_null :my_models, :date_column, false 

Pour vous assurer qu’aucun enregistrement n’existe avec null valeurs null dans cette colonne:

 MyModel.update_all({ date_column: Time.now }, { date_column: nil }) 

Rails 4 (les autres réponses Rails 4 ont des problèmes):

 def change change_column_null(:users, :admin, false,  ) # change_column(:users, :admin, :ssortingng, :default => "") end 

Changer une colonne avec des valeurs NULL pour ne pas autoriser NULL entraînera des problèmes. C’est exactement le type de code qui fonctionnera correctement dans votre configuration de développement, puis se bloquera lorsque vous tenterez de le déployer sur votre production LIVE . Vous devez d’abord changer les valeurs NULL en quelque chose de valide, puis interdire les valeurs NULL. La 4ème valeur de change_column_null fait exactement cela. Voir la documentation pour plus de détails.

En outre, je préfère généralement définir une valeur par défaut pour le champ afin de ne pas avoir à spécifier la valeur du champ chaque fois que je crée un nouvel object. J’ai également inclus le code commenté.

Créez une migration avec une instruction change_column avec une :default => .

change_column :my_table, :my_column, :integer, :default => 0, :null => false

Voir: change_column

Selon le moteur de firebase database, vous devrez peut-être utiliser change_column_null

Rails 4:

 def change change_column_null(:users, :admin, false ) end 

Dans Rails 4.02+ selon les documents, il n’existe pas de méthode comme update_all avec 2 arguments. Au lieu de cela on peut utiliser ce code:

 # Make sure no null value exist MyModel.where(date_column: nil).update_all(date_column: Time.now) # Change the column to not allow null change_column :my_models, :date_column, :datetime, null: false 

Vous ne pouvez pas utiliser add_timestamps et null: false si vous avez des enregistrements existants. Voici la solution:

 def change add_timestamps(:buttons, null: true) Button.find_each { |b| b.update(created_at: Time.zone.now, updated_at: Time.zone.now) } change_column_null(:buttons, :created_at, false) change_column_null(:buttons, :updated_at, false) end