[RUBY] So benennen Sie ein Modell mit externen Schlüsseleinschränkungen in Rails um

Wenn Sie den Modellnamen ändern möchten, müssen Sie nichts berücksichtigen, wenn Sie nur die entsprechende Tabelle ändern. Wenn Sie jedoch ein untergeordnetes Modell haben, das auf die entsprechende Tabelle verweist, müssen Sie auch den externen Schlüssel des untergeordneten Modells ändern. Für Projekte, die noch nicht veröffentlicht wurden, können Sie die vorhandene Migrationsdatei neu schreiben und "Rails DB: Migrate: Reset" ausführen, jedoch nicht für Projekte, die bereits Daten haben.

Modellvorbereitung

Bereiten Sie zuerst das Modell vor. Dieses Mal bereiten wir das Benutzermodell und das Aufgabenmodell vor, die sich auf Benutzer has_many Tasks beziehen. Um den Inhalt des Modells leichter verständlich zu machen, werde ich diesmal keine anderen Spalten als den externen Schlüssel schreiben.

rails g model User rails g model Task user:references

Mit dem obigen Befehl werden die folgenden zwei Migrationsdateien erstellt.

db/migration/20201004121521_create_users.rb



class CreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|

      t.timestamps
    end
  end
end

db/migration/20201004121556_create_tasks.rb



class CreateTasks < ActiveRecord::Migration[6.0]
  def change
    create_table :tasks do |t|
      t.references :user, null: false, foreign_key: true

      t.timestamps
    end
  end
end

Rails db: migrate aktualisiert schema.rb.

db/schema.rb



ActiveRecord::Schema.define(version: 2020_10_04_121556) do

  create_table "tasks", force: :cascade do |t|
    t.integer "user_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["user_id"], name: "index_tasks_on_user_id"
  end

  create_table "users", force: :cascade do |t|
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  add_foreign_key "tasks", "users"
end

Wenn Sie in Schienen einen Referenztyp angeben, wird der Index ohne Erlaubnis eingefügt. Auch wenn Sie nicht "index: true" setzen, wird "t.index [" user_id "], name:" index_tasks_on_user_id "` beschrieben. Da "Foreign_key: True" angegeben wurde, wird "Add_foreign_key" Tasks "," Users "" beschrieben.

Wie oben erwähnt, wurden das Benutzermodell und das damit verbundene Aufgabenmodell erstellt.

Ändern Sie den Modellnamen

Ändern wir nun das Benutzermodell in AdminUser. Erstellen Sie zunächst eine Migrationsdatei, die den Modellnamen normal ändert, und migrieren Sie sie.

Erstellen Sie die folgende Datei mit Rails g Migration RenameUserToAdminUser und Rails DB: migrate

db/migration/20201004123215_rename_user_to_admin_user.rb



class RenameUserToAdminUser < ActiveRecord::Migration[6.0]
  def change
    rename_table :users, :admin_users
  end
end

Lassen Sie uns schema.rb überprüfen. Wie du siehst, ① Benutzer wurde in admin_user umbenannt.

Aber, (2) Der externe Schlüssel des Aufgabenmodells bleibt user_id und wurde nicht umbenannt. (Apropos natürlich natürlich)

Und (3) Der externe Schlüsselbeschränkungsteil ist mit dem Spaltennamen user_id mit admin_user verknüpft.

db/schema.rb



ActiveRecord::Schema.define(version: 2020_10_04_123215) do

  create_table "admin_users", force: :cascade do |t| # ←①
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  create_table "tasks", force: :cascade do |t|
    t.integer "user_id", null: false # ←②
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["user_id"], name: "index_tasks_on_user_id"
  end

  add_foreign_key "tasks", "admin_users", column: "user_id" # ←③
end

Wenn Sie dieses Schema überprüfen, scheint eine Reihe von Korrekturen abgeschlossen zu sein, wenn Sie den Spaltennamen mit der Einschränkung für den externen Schlüssel ändern!

Ändern Sie den Namen der externen Schlüsselspalte

Erstellen wir nun eine Migrationsdatei, die den Spaltennamen ändert. rails g migration RenameUserIdToAdminUserId

db/migration/20201004125441_rename_user_id_to_admin_user_id.rb



class RenameUserIdToAdminUserId < ActiveRecord::Migration[6.0]
  def change
    rename_column :tasks, :user_id, :admin_user_id
  end
end

rails db:migrate

Die Änderung des Spaltennamens wurde übernommen. ④ Die Benutzer-ID des Task-Modells wird zu admin_user_id. (5) Der Spaltenname des externen Schlüssels wird nicht mehr angegeben.

db/schema.rb



ActiveRecord::Schema.define(version: 2020_10_04_125441) do

  create_table "admin_users", force: :cascade do |t|
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  create_table "tasks", force: :cascade do |t|
    t.integer "admin_user_id", null: false # ←④
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["admin_user_id"], name: "index_tasks_on_admin_user_id"
  end

  add_foreign_key "tasks", "admin_users" # ←⑤
end

Zusammenfassung

So ändern Sie den Modellnamen mit der externen Schlüsselbeschränkung

  1. Ändern Sie den Modellnamen
  2. Ändern Sie den externen Schlüsselnamen für das Modell

Das war alles was ich tun konnte. Es war unerwartet einfach. Insbesondere waren es Rails, die die Richtung des externen Schlüssels nur durch Ändern des Modellnamens änderten.

Recommended Posts

So benennen Sie ein Modell mit externen Schlüsseleinschränkungen in Rails um
[So fügen Sie ein Video mit Rails in haml ein]
So speichern Sie gleichzeitig Daten in einem Modell, das einem verschachtelten Formular zugeordnet ist (Rails 6.0.0)
[Rails] So schreiben Sie user_id (externer Schlüssel) in einen starken Parameter
So fügen Sie ein Video in Rails ein
So löschen Sie Daten mit einem externen Schlüssel
So implementieren Sie eine ähnliche Funktion in Rails
So erstellen Sie einfach ein Pulldown mit Rails
So schreiben Sie eine Datumsvergleichssuche in Rails
Abfragen von Arrays in jsonb mit Rails + postgres
[Rails 6] So legen Sie ein Hintergrundbild in Rails [CSS] fest
[Rails] So laden Sie JavaScript in einer bestimmten Ansicht
Umgang mit Fehlern in Rails s konnte keine JavaScript-Laufzeit finden.
[Ruby on Rails] Fügen Sie eine Spalte mit externen Schlüsselbeschränkungen hinzu
So zeigen Sie Diagramme in Ruby on Rails an (LazyHighChart)
Zuordnung zu einer Klasse mit einem Wertobjekt in How to My Batis
So richten Sie einen Proxy mit Authentifizierung in Feign ein
So installieren Sie jQuery in Rails 6
So installieren Sie Swiper in Rails
So erstellen Sie eine JAR-Datei ohne Abhängigkeiten in Maven
So erhalten Sie den Wert von Boolean mit jQuery in einfacher Rails-Form
So implementieren Sie Suchfunktionen in Rails
So ändern Sie den App-Namen in Rails
Fügen Sie der Spalte mit der Migration einen externen Schlüssel hinzu
Verwendung von MySQL im Rails-Tutorial
[Rails] So erstellen Sie eine Teilvorlage
So implementieren Sie Ranking-Funktionen in Rails
So veröffentlichen Sie eine Bibliothek in jCenter
Verwendung von credentials.yml.enc aus Rails 5.2
So erstellen Sie eine Rails 6-Umgebung mit Docker
So implementieren Sie eine Diashow mit Slick in Rails (einzeln und mehrfach nacheinander)
So erstellen Sie eine Abfrage mithilfe von Variablen in GraphQL [Verwenden von Ruby on Rails]
[Persönliches Memo] Interaktion mit dem Zufallszahlengenerator in Java
So aktualisieren Sie Benutzeränderungen in Rails Devise, ohne ein Kennwort einzugeben
So erstellen Sie eine Ruby on Rails-Entwicklungsumgebung mit Docker (Rails 6.x)
[Rails] So erhalten Sie die aktuell mit devise angemeldeten Benutzerinformationen
SSH in Ubuntu von einem Terminal mit öffentlicher Schlüsselauthentifizierung
So debuggen Sie die Verarbeitung im Ruby on Rails-Modell nur mit der Konsole
So erstellen Sie eine Ruby on Rails-Entwicklungsumgebung mit Docker (Rails 5.x)
[Rails] So wenden Sie das in der Hauptanwendung verwendete CSS mit Administrate an
So starten Sie einen Docker-Container mit einem in einer Batchdatei bereitgestellten Volume
Schienen: Wie man eine Rechenaufgabe schön schreibt
Mit Rails in eine Tag-zu-URL-Zeichenfolge konvertieren
[Rails] Wie schreibe ich, wenn ich eine Unterabfrage mache?
[Rails] Rails neu, um eine Datenbank mit PostgreSQL zu erstellen
[Rails] So erstellen Sie ein Diagramm mit lazy_high_charts
So zeigen Sie eine Webseite in Java an
[Rails] Verwendung von Auswahlfeldern in Ransack
Wie man Rails allgemein ins Japanische übersetzt