Domanda

ho il problema, che ho un migrazione Rails che imposta un'impostazione predefinita per una colonna, come in questo esempio:

def self.up
  add_column :column_name, :bought_at, :datetime, :default => Time.now
end

E se, mi piace far cadere che le impostazioni predefinite in una migrazione in seguito, come posso fare che con l'utilizzo di rotaie migrazioni?

La mia soluzione attuale è l'esecuzione di un comando SQL personalizzata nella migrazione rotaie, in questo modo:

def self.up
  execute 'alter table column_name alter bought_at drop default'
end

Ma non mi piace questo approccio, perché io sono ora dipende da come il database sottostante interpreta questo comando. In caso di modifica del database questa domanda forse potrebbe non funziona più e la migrazione sarebbe rotto. Quindi, c'è un modo per esprimere l'annullamento di un'impostazione di default per una colonna in rotaie?

È stato utile?

Soluzione

Rotaie 5 +

def change
  change_column_default( :table_name, :column_name, from: nil, to: false )
end

Rails 3 e Rails 4

def up
  change_column_default( :table_name, :column_name, nil )
end

def down
  change_column_default( :table_name, :column_name, false )
end

Altri suggerimenti

Suona come che stai facendo la cosa giusta con il vostro 'eseguire', come la documentazione sottolineano:

change_column_default(table_name, column_name, default)
     

Imposta un nuovo valore predefinito per una colonna.    Se si desidera impostare il valore di default   NULL, siete fuori di fortuna. Hai bisogno   a DatabaseStatements # eseguire il   istruzione SQL appropriata se stessi.   Esempi

change_column_default(:suppliers, :qualification, 'new')
change_column_default(:accounts, :authorized, 1)

Il seguente frammento che utilizzo per fare le colonne NULL NOT NULL, ma saltare DEFAULT a livello di schema:

def self.up
  change_column :table, :column, :string, :null => false, :default => ""
  change_column_default(:table, :column, nil)
end

Rails 4

change_column :courses, :name, :string, limit: 100, null: false
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top