ruby-on-rails - generate - ruby on rails migrations




Come posso rinominare una colonna del database in una migrazione Ruby on Rails? (17)

Alcune versioni di Ruby on Rails supportano il metodo up / down per la migrazione e se hai un metodo up / down nella tua migrazione, allora:

def up
    rename_column :table_name, :column_old_name, :column_new_name
end

def down
    rename_column :table_name, :column_new_name, :column_old_name
end

Se hai il metodo di change nella tua migrazione, allora:

def change
    rename_column :table_name, :column_old_name, :column_new_name
end

Per ulteriori informazioni puoi muoverti: Ruby on Rails - Migrations o Active Record Migrations .

Ho erroneamente chiamato una colonna hased_password anziché hashed_password .

Come aggiorno lo schema del database, usando la migrazione per rinominare questa colonna?


Apri la tua console Ruby on Rails e inserisci:

ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column

Come opzione alternativa, se non sei sposato con l'idea delle migrazioni, c'è una gemma avvincente per ActiveRecord che gestirà automaticamente le modifiche al nome per te, in stile Datamapper. Tutto quello che fai è cambiare il nome della colonna nel tuo modello (e assicurati di aver installato Model.auto_upgrade! Nella parte inferiore del tuo model.rb) e viola! Il database è aggiornato al volo.

https://github.com/DAddYE/mini_record

Nota: sarà necessario nuke db / schema.rb per evitare conflitti

Ancora in fase beta e ovviamente non per tutti ma ancora una scelta irresistibile (attualmente la sto utilizzando in due app di produzione non banali senza problemi)


Crea semplicemente una nuova migrazione e, in un blocco, utilizza rename_column come di seguito.

rename_column :your_table_name, :hased_password, :hashed_password

Esegui rails g migration ChangesNameInUsers (o qualsiasi altra cosa desideri nominare)

Apri il file di migrazione che è appena stato generato e aggiungi questa linea nel metodo (tra la def change e la end ):

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

Salva il file ed esegui rake db:migrate nella console

Controlla il tuo schema.db per vedere se il nome è effettivamente cambiato nel database!

Spero che questo ti aiuti :)


Esegui il comando seguente per creare un file di migrazione:

rails g migration ChangeHasedPasswordToHashedPassword

Quindi nel file generato nella cartella db/migrate , scrivi rename_column come di seguito:

class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
  def change
     rename_column :table_name, :hased_password, :hashed_password
  end
end

IMO, in questo caso, usa meglio rake db:rollback . Quindi modifica la tua migrazione e digita nuovamente rake db:migrate . Tuttavia, se hai dati nella colonna che non vuoi perdere, usa rename_column .


Manualmente possiamo usare il seguente metodo:

Possiamo modificare la migrazione manualmente come:

  • Apri app/db/migrate/xxxxxxxxx_migration_file.rb

  • Aggiorna hased_password in hashed_password

  • Esegui il comando qui sotto

    $> rake db:migrate:down VERSION=xxxxxxxxx
    

Quindi rimuoverà la tua migrazione:

$> rake db:migrate:up VERSION=xxxxxxxxx

Aggiungerà la tua migrazione con la modifica aggiornata.


Rails 5 modifiche di migrazione

per esempio:

rails g model Studente student_name: string age: intero

se vuoi cambiare la colonna student_name come nome

Nota: - se non si esegue il comando rails db: migrate

Puoi fare i seguenti passi

rails d model Studente student_name: string age: intero

Questo rimuoverà il file di migrazione generato, Ora puoi correggere il nome della tua colonna

rails g model Nome dello studente: string age: intero

Se è stata eseguita la migrazione (rails db: migrate), le seguenti opzioni consentono di modificare il nome della colonna

rails g migration RemoveStudentNameFromStudent student_name: string

rails g migration AddNameToStudent name: string


Se è necessario cambiare i nomi delle colonne, sarà necessario creare un segnaposto per evitare un errore del nome della colonna duplicato . Ecco un esempio:

class SwitchColumns < ActiveRecord::Migration
  def change
    rename_column :column_name, :x, :holder
    rename_column :column_name, :y, :x
    rename_column :column_name, :holder, :y
  end
end

Se il tuo codice non è condiviso con un altro, allora l'opzione migliore è fare semplicemente rake db:rollback quindi modificare il nome della tua colonna in migrazione e rake db:migrate . Questo è tutto

E puoi scrivere un'altra migrazione per rinominare la colonna

 def change
    rename_column :table_name, :old_name, :new_name
  end

Questo è tutto.


Se la colonna è già popolata con dati e vivi in ​​produzione, ti consiglio un approccio graduale, in modo da evitare tempi di inattività durante l'attesa delle migrazioni.

Innanzitutto vorrei creare una migrazione db per aggiungere colonne con i nuovi nomi e popolarli con i valori del vecchio nome della colonna.

class AddCorrectColumnNames < ActiveRecord::Migration
  def up
    add_column :table, :correct_name_column_one, :string
    add_column :table, :correct_name_column_two, :string

    puts 'Updating correctly named columns'
    execute "UPDATE table_name SET correct_name_column_one = old_name_column_one, correct_name_column_two = old_name_column_two"
    end
  end

  def down
    remove_column :table, :correct_name_column_one
    remove_column :table, :correct_name_column_two
  end
end

Poi mi impegnerei proprio in quel cambiamento e spingere il cambiamento in produzione.

git commit -m 'adding columns with correct name'

Quindi, una volta che il commit è stato spinto in produzione, correrei.

Production $ bundle exec rake db:migrate

Quindi aggiornerei tutte le viste / i controller che facevano riferimento al nome della vecchia colonna al nuovo nome della colonna. Esegui la mia suite di test e commetti solo tali modifiche. (Dopo aver verificato che funzionasse localmente e superando prima tutti i test!)

git commit -m 'using correct column name instead of old stinky bad column name'

Quindi spingere l'impegno alla produzione.

A questo punto è possibile rimuovere la colonna originale senza preoccuparsi di alcun tipo di downtime associato alla migrazione stessa.

class RemoveBadColumnNames < ActiveRecord::Migration
  def up
    remove_column :table, :old_name_column_one
    remove_column :table, :old_name_column_two
  end

  def down
    add_column :table, :old_name_column_one, :string
    add_column :table, :old_name_column_two, :string
  end
end

Quindi spingere questa ultima migrazione alla produzione ed eseguire bundle exec rake db:migrate in background.

Mi rendo conto che questo è un po 'più impegnativo di un processo, ma preferirei farlo piuttosto che avere problemi con la mia migrazione di produzione.



Aggiornamento : un cugino stretto di create_table è change_table, utilizzato per modificare le tabelle esistenti. È usato in modo simile a create_table ma l'oggetto ceduto al blocco conosce più trucchi. Per esempio:

class ChangeBadColumnNames < ActiveRecord::Migration
  def change
    change_table :your_table_name do |t|
      t.rename :old_column_name, :new_column_name
    end
  end
end

In questo modo è più efficiente se utilizziamo altri metodi alternativi come: rimuovi / aggiungi indice / rimuovi indice / aggiungi colonna, ad esempio possiamo fare di più:

# Rename
t.rename :old_column_name, :new_column_name
# Add column
t.string :new_column
# Remove column
t.remove :removing_column
# Index column
t.index :indexing_column
#...

Genera una migrazione Ruby on Rails :

$:> rails g migration Fixcolumnname

Inserisci il codice nel file di migrazione (XXXXXfixcolumnname.rb) :

class Fixcolumnname < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

 def change
    rename_column :table_name, :old_column_name, :new_column_name
  end

rename_column :table, :old_column, :new_column

Aggiornare:

Probabilmente vorrai creare una migrazione separata per farlo. (Rinomina FixColumnName come vuoi)

script/generate migration FixColumnName
# creates  db/migrate/xxxxxxxxxx_fix_column_name.rb

Quindi modifica la migrazione per fare la tua volontà.

# db/migrate/xxxxxxxxxx_fix_column_name.rb
class FixColumnName < ActiveRecord::Migration
  def self.up
    rename_column :table_name, :old_column, :new_column
  end

  def self.down
    # rename back if you need or do something else or do nothing
  end
end

Un aggiornamento per Rails 3.1

Mentre, i metodi up e down si applicano ancora. Rails 3.1 riceve un metodo di change che "sa come eseguire la migrazione del database e annullarlo quando viene eseguito il rollback della migrazione senza la necessità di scrivere un metodo down separato"

rails g migration FixColumnName

class FixColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

Se ti capita di avere un intero gruppo di colonne da rinominare, o qualcosa che avrebbe richiesto di ripetere il nome della tabella più e più volte.

rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...

Potresti usare change_table per mantenere le cose un po 'più change_table .

class FixColumnNames < ActiveRecord::Migration
  def change
    change_table :table_name do |t|
      t.rename :old_column1, :new_column1
      t.rename :old_column2, :new_column2
      ...
    end
  end
end

Grazie, Luke && Turadg , per aver sollevato l'argomento.

Quindi basta db:migrate come al solito o comunque si va sulla tua attività.

Un aggiornamento per Rails 4

Durante la creazione di una Migration come per rinominare una colonna, Rails 4 genera un metodo di change invece che up e down come menzionato nella risposta sopra. Il metodo di change generato è il seguente:

$ > rails g migration ChangeColumnName

che creerà un file di migrazione simile a questo:

class ChangeColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end




migration