2010-02-16 22 views
9

E 'possibile rinominare una colonna usando un comando come:rinominare una colonna in Rails

script/generate migration AddColumnToTable column:type 

? Grazie.

+2

possibile duplicato di [Come rinominare una colonna del database nei binari usando la migrazione?] (Http://stackoverflow.com/questions/1992019/how-to-rename-a -database-column-in-rails-using-migration) – CharlesB

risposta

17

Rails ha un comando di migrazione su ActiveRecord ConnectionAdapter chiamato rename_column. È possibile generare una migrazione e quindi scrivere il codice da soli. Esempio (MySQL):

script/generate migration rename_my_column_by_hand 

quindi modificare il file viene creato:

class RenameMyColumnByHand < ActiveRecord::Migration 
    def self.up 
    rename_column :my_table, :old_name, :new_name 
    end 

    def self.down 
    rename_column :my_table, :new_name, :old_name 
    end 
end 

Esegue SQL come:

ALTER TABLE my_table CHANGE old_name new_name BIGINT; 

Nota Ciò rinomina solo la colonna, ha vinto' t rinomina qualsiasi riferimento a te presente su altre tabelle.

+0

Grazie Scott, molto utile – Victor

+0

wow funziona davvero, anche con sqlite. Ho sempre questo problema perché mi piace usare i nomi delle colonne che sono riservati nelle rotaie e finora ho usato approcci molto più complicati. – Zane

2

Ottima domanda. La risposta è, purtroppo, no. Vedere Rails 2.3.5 codice sorgente:

lib/rails_generator/generators/components/migration/migration_generator.rb 

Le uniche parole chiave che sono riconosciuti dal generatore di migrazione sono add, remove, e to/from.

1

Qui uso un po 'di inganno. Dì che voglio cambiare colonna foo in bar.

Creare una migrazione con i seguenti passi

  • aggiungere una colonna temp_foo temporanea
  • aggiornamento tutti i record, salvando il valore di foo in temp_foo
  • Aggiungere una colonna bar
  • aggiornamento tutti i record, risparmiando temp_foo di valore in bar
  • Drop column foo
  • Colonna di rilascio temp_foo

Questo è ex-tre-me-ly fragile. Se un passo fallisce, potresti perdere i dati ..

Problemi correlati