it-swarm.com.de

Wie kann ich eine Datenbankspalte in einer Ruby on Rails-Migration umbenennen?

Ich habe fälschlicherweise eine Spalte hased_password anstelle von hashed_password benannt.

Wie aktualisiere ich das Datenbankschema und benutze die Migration, um diese Spalte umzubenennen?

1346
user1994764
rename_column :table, :old_column, :new_column

Update:

Möglicherweise möchten Sie dazu eine separate Migration erstellen. (Benennen Sie FixColumnName wie gewünscht um.)

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

Bearbeiten Sie dann die Migration, um Ihren Willen zu erfüllen.

# 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

Ein Update für Rails 3.1

Die Methoden up und down gelten weiterhin. Rails 3.1 erhält eine change-Methode, mit der "die Datenbank migriert und rückgängig gemacht werden kann, wenn die Migration rückgängig gemacht wird, ohne dass eine separate Down-Methode geschrieben werden muss"

Rails g migration FixColumnName

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

Wenn Sie eine ganze Reihe von Spalten umbenennen möchten oder etwas, das den Tabellennamen immer und immer wieder wiederholen müsste.

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

Sie könnten change_table verwenden, um die Dinge ein wenig sauberer zu halten.

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

Danke, Luke && Turadg, für das Aufrufen des Themas.

Dann db:migrate wie gewohnt oder wie auch immer Sie sich um Ihr Geschäft kümmern.


Ein Update für Rails 4

Beim Erstellen einer Migration für das Umbenennen einer Spalte generiert Rails 4 eine change-Methode anstelle von up und down, wie in der obigen Antwort erwähnt. Die generierte change-Methode sieht wie folgt aus: 

$ > Rails g migration ChangeColumnName

dadurch wird eine ähnliche Migrationsdatei erstellt:

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

IMO, in diesem Fall besser rake db:rollback verwenden. Bearbeiten Sie dann die Migration und geben Sie erneut rake db:migrate ein. Wenn Sie jedoch Daten in der Spalte haben, die Sie nicht verlieren möchten, verwenden Sie rename_column.

67
elf.xf

http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

Unter Available Transformations

rename_column(table_name, column_name, new_column_name):

Benennt eine Spalte um, behält jedoch Typ und Inhalt bei.

26
James Manning

Wenn die Spalte bereits mit Daten gefüllt ist und sich in der Produktion befindet, würde ich eine schrittweise Vorgehensweise empfehlen, um Ausfallzeiten in der Produktion zu vermeiden, während auf die Migrationen gewartet wird.

Zuerst würde ich eine Datenbankmigration erstellen, um Spalten mit den neuen Namen hinzuzufügen und sie mit den Werten aus dem alten Spaltennamen zu füllen.

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

Dann würde ich genau diese Änderung festlegen und die Änderung in die Produktion bringen.

git commit -m 'adding columns with correct name'

Sobald das Commit in die Produktion getrieben wurde, würde ich laufen.

Production $ bundle exec rake db:migrate

Dann würde ich alle Ansichten/Controller, die auf den alten Spaltennamen verweisen, auf den neuen Spaltennamen aktualisieren. Führen Sie meine Testsuite durch und übernehmen Sie diese Änderungen. (Nachdem Sie sich vergewissert haben, dass es lokal funktioniert hat und alle Tests zuerst bestanden haben!)

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

Dann würde ich das Commit zur Produktion drängen. 

An dieser Stelle können Sie die ursprüngliche Spalte entfernen, ohne sich um etwaige Ausfallzeiten für die Migration zu kümmern.

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

Dann schieben Sie diese letzte Migration in die Produktion und führen Sie bundle exec rake db:migrate im Hintergrund aus.

Mir ist klar, dass dies ein bisschen mehr mit einem Prozess zu tun hat, aber ich würde dies lieber tun, als Probleme bei meiner Produktionsmigration zu haben.

24
Paul Pettengill

Führen Sie den folgenden Befehl aus, um eine Migrationsdatei zu erstellen:

Rails g migration ChangeHasedPasswordToHashedPassword

Dann schreiben Sie in der Datei, die im Ordner db/migrate generiert wurde, rename_column wie folgt:

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

Von API:

rename_column(table_name, column_name, new_column_name)

Es benennt eine Spalte um, behält jedoch den Typ und den Inhalt bei.

13
super_p

Einige Versionen von Ruby on Rails unterstützen die Up/Down-Methode für die Migration. Wenn Sie bei der Migration eine Up/Down-Methode verwenden, gilt Folgendes:

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

Wenn Sie die change-Methode in Ihrer Migration verwenden, gilt Folgendes:

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

Für weitere Informationen können Sie verschieben: Ruby on Rails - Migrationen oder Aktive Datensatzmigrationen.

12
uma

Wenn Ihr Code nicht mit einem anderen Code geteilt wird, ist es am besten, nur rake db:rollback Zu bearbeiten und dann den Spaltennamen in der Migration und rake db:migrate zu bearbeiten. Das ist es

Sie können eine weitere Migration zum Umbenennen der Spalte schreiben 

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

Das ist es.

10
sunil

Wenn Sie die Spaltennamen wechseln müssen, müssen Sie einen Platzhalter erstellen, um einen doppelten Spaltennamen error zu vermeiden. Hier ist ein Beispiel:

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
8
Abram

Wenn die vorliegenden Daten für Sie nicht wichtig sind, können Sie Ihre ursprüngliche Migration einfach mit folgendem Befehl entfernen:

rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'

Nehmen Sie dann ohne Anführungszeichen Änderungen an der ursprünglichen Migration vor und führen Sie die Up-Migration erneut durch:

rake db:migrate
7
dirtydexter

Wenn Sie nicht mit der Idee von Migrationen verheiratet sind, gibt es für ActiveRecord ein interessantes Kleinod, das die Namensänderungen automatisch für Sie behandelt, im Datamapper-Stil. Alles, was Sie tun, ist, den Spaltennamen in Ihrem Modell zu ändern (und stellen Sie sicher, dass Sie Model.auto_upgrade! Am unteren Rand Ihres Modells.rb) und Viola! Die Datenbank wird im laufenden Betrieb aktualisiert. 

https://github.com/DAddYE/mini_record

Hinweis: Sie müssen db/schema.rb abschalten, um Konflikte zu vermeiden

Noch in Beta-Phase und offensichtlich nicht für jedermann, aber immer noch eine überzeugende Wahl (ich verwende es derzeit in zwei nicht-trivialen Produktions-Apps ohne Probleme).

7
Steven Garcia

Für Ruby on Rails 4:

def change
    rename_column :table_name, :column_name_old, :column_name_new
end
6
Hardik Hardiya

Erstellen Sie einfach eine neue Migration und verwenden Sie rename_column in einem Block wie folgt.

rename_column :your_table_name, :hased_password, :hashed_password
6
jon snow

Manuell können wir die folgende Methode verwenden:

Wir können die Migration manuell bearbeiten wie:

  • app/db/migrate/xxxxxxxxx_migration_file.rb öffnen

  • hased_password auf hashed_password aktualisieren

  • Führen Sie den folgenden Befehl aus

    $> rake db:migrate:down VERSION=xxxxxxxxx
    

Dann wird die Migration entfernt:

$> rake db:migrate:up VERSION=xxxxxxxxx

Ihre Migration wird mit der aktualisierten Änderung hinzugefügt.

5
Sumit Munot

Führen Sie Rails g migration ChangesNameInUsers aus (oder wie auch immer Sie es benennen möchten)

Öffnen Sie die soeben erstellte Migrationsdatei und fügen Sie diese Zeile in die Methode ein (zwischen def change und end):

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

Speichern Sie die Datei und führen Sie rake db:migrate in der Konsole aus

Überprüfen Sie Ihren schema.db, um zu sehen, ob sich der Name tatsächlich in der Datenbank geändert hat!

Hoffe das hilft :)

4
Maddie

Generiere die Migrationsdatei:

Rails g migration FixName

# erstellt db/migrate/xxxxxxxxxx.rb

Bearbeiten Sie die Migration, um Ihren Willen zu erfüllen.

class FixName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end
4
vipin
$:  Rails g migration RenameHashedPasswordColumn
invoke  active_record
      create    db/migrate/20160323054656_rename_hashed_password_column.rb

Öffnen Sie diese Migrationsdatei und ändern Sie sie wie folgt (Geben Sie Ihren ursprünglichen table_name ein).

class  RenameHashedPasswordColumn < ActiveRecord::Migration
  def change
    rename_column :table_name, :hased_password, :hashed_password
  end
end
4
Prabhakar
 def change
    rename_column :table_name, :old_column_name, :new_column_name
  end
3
Apoorv

Erzeugen Sie eine Ruby on Rails-Migration :

$:> Rails g migration Fixcolumnname

Code in die Migrationsdatei einfügen (XXXXXfixcolumnname.rb) :

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

Sie haben zwei Möglichkeiten, dies zu tun:

  1. Bei diesem Typ wird beim Zurücksetzen automatisch der umgekehrte Code ausgeführt.

    def change
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
  2. Bei diesem Typ wird die Up-Methode ausgeführt, wenn rake db:migrate und die Down-Methode, wenn rake db:rollback:

    def self.up
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
    def self.down
      rename_column :table_name,:new_column_name,:old_column_name
    end
    
2
Sarwan Kumar

Öffnen Sie Ihre Ruby on Rails-Konsole und geben Sie Folgendes ein:

ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
2
rinold simon

Ich bin bei Rails 5.2 und versuche, eine Kolumne eines devise-Benutzers umzubenennen.

das rename_column-Bit hat bei mir funktioniert, aber der singuläre :table_name hat einen Fehler "User table not found" ausgegeben. Plural arbeitete für mich.

Rails g RenameAgentinUser

Dann ändern Sie die Migrationsdatei folgendermaßen:

rename_column :users, :agent?, :agent

Wo: agent ist der alte Spaltenname.

1
tomb

Lassen Sie uns KISS . Alles was es braucht, sind drei einfache Schritte. Folgendes funktioniert für Rails 5.2.

1 Erstellen Sie eine Migration

  • Rails g migration RenameNameToFullNameInStudents

  • Rails g RenameOldFieldToNewFieldInTableName - so ist es für Verwalter der Code-Basis später völlig klar. (Verwenden Sie einen Plural für den Tabellennamen).

2. Bearbeiten Sie die Migration

# I prefer to explicitly write theupanddownmethods.

# ./db/migrate/20190114045137_rename_name_to_full_name_in_students.rb

class RenameNameToFullNameInStudents < ActiveRecord::Migration[5.2]
  def up
    # rename_column :table_name, :old_column, :new_column
    rename_column :students, :name, :full_name
  end

  def down
            # Note that the columns are reversed
    rename_column :students, :full_name, :name
  end
end

3. Führen Sie Ihre Migrationen aus

rake db:migrate

Und du gehst zu den Rennen!

0
BKSpurgeon

Generieren Sie einfach die Migration mit dem Befehl 

Rails g migration rename_hased_password

Danach bearbeiten Sie die Migration folgende Zeile in der Änderungsmethode

rename_column :table, :hased_password, :hashed_password

Das sollte den Trick tun.

0
Ratnam Yadav

Änderungen bei der Migration von Rails 5 

z.B: 

Rails g-Modell Student student_name: Zeichenfolge Alter: Ganzzahl

wenn Sie die Spalte student_name als name ändern möchten

Hinweis: - Wenn Sie Rails db nicht ausführen: migrate

Sie können die folgenden Schritte ausführen 

Rails d Modell Student student_name: Zeichenfolge Alter: Integer

Dadurch wird die generierte Migrationsdatei entfernt. Jetzt können Sie den Spaltennamen korrigieren

Rails g-Modell Name des Schülers: Alter der Zeichenfolge: Ganzzahl

Wenn Sie migriert haben (Rails db: migrate), folgen Sie den Optionen zum Ändern des Spaltennamens

Migration von Rails g RemoveStudentNameFromStudent student_name: Zeichenfolge

Migration von Rails g AddNameToStudent: Zeichenfolge

0
prasanthrubyist