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.
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 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!
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
So ändern Sie den Modellnamen mit der externen Schlüsselbeschränkung
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