web-dev-qa-db-fra.com

Ruby sur Rails: Comment puis-je ajouter une contrainte non nulle à une colonne existante à l'aide d'une migration?

Dans mon Rails (3.2), il y a beaucoup de tables dans ma base de données, mais j'ai oublié d'ajouter quelques contraintes non nulles. J'ai cherché dans Google mais je ne trouve pas comment écrire une migration qui ajoute non null à une colonne existante.

TIA.

124
David Robertson

Pour Rails 4+, réponse de nates (utilisez change_column_null ) est préférable.

Pre-Rails 4, essayez change_column .

91
Dan Wich

Vous pouvez également utiliser change_column_null :

change_column_null :table_name, :column_name, false
257
nates

1) PREMIER: Ajouter une colonne avec la valeur par défaut

2) ALORS: supprimer la valeur par défaut

add_column :orders, :items, :integer, null: false, default: 0
change_column :orders, :items, :integer, default: nil
9
rndrfero

Si vous l'utilisez sur un nouveau script/schéma create migration, voici comment nous pouvons le définir.

class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
    t.string :name, null: false     # Notice here, NOT NULL definition
    t.string :email, null: false
    t.string :password, null: false
    t.integer :created_by
    t.integer :updated_by 

    t.datetime :created_at
    t.datetime :updated_at, default: -> { 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' }
   end
  end
end
1
Manjunath Reddy