[RUBY] Lesen Sie das Rails-Handbuch (Active Record Migration) erneut

1. Was ist Active Record-Migration?

2. Migrationsübersicht

3. Erstellen Sie eine Migration

3-1. Migration beim Hinzufügen / Löschen von Spalten

Beispiel: Beim Hinzufügen einer E-Mail-Spalte zur Benutzertabelle
$ rails g migration AddEmailToUsers email:string

Beispiel: Beim Entfernen einer Hobbyspalte aus der Benutzertabelle
$ rails g migration RemoveHobbyFromUsers hobby:string

Wenn der obige Migrationsgenerierungsbefehl ausgeführt wird, wird die folgende Migrationsdatei generiert.

Beim Hinzufügen einer Spalte


class AddEmailToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :email, :string
  end
end

Beim Löschen einer Spalte


class RemoveHobbyFromUsers < ActiveRecord::Migration[5.0]
  def change
    remove_column :users, :hobby, :string
  end
end

3-2. Migration beim Generieren einer Tabelle

$ rails g migration CreatePosts name:string content:text

Wenn Sie die oben genannten Schritte ausführen, wird Folgendes generiert:

Beim Erstellen einer Tabelle


class CreatePosts < ActiveRecord::Migration[5.0]
  def change
    create_table :posts do |t|
      t.string :name
      t.text :content

      t.timestamps
    end
  end
end

Der bisher generierte Inhalt ist nur ein Ausgangspunkt, Sie können "db / migrate / YYYYMMDDHHMMSS_add_genre_to_posts.rb" generieren und Spalten zur Tabelle hinzufügen / löschen.

3. Referenzen angeben

Sie können Referenzen als Spaltentyp angeben.

$ rails g migration AddUserRefToPosts user:references

Wenn Sie die oben genannten Schritte ausführen, wird Folgendes generiert:

class AddUserRefToPosts < ActiveRecord::Migration[5.0]
  def change
    add_reference :posts, :user, foreign_key: true
  end
end

Durch Ausführen dieser Migration wird eine "Benutzer-ID" in der Beitragstabelle erstellt und der entsprechende Index hinzugefügt.

3-4. Join-Tabellen generieren`

Eine Migration zum Generieren einer Join-Tabelle ist auch möglich, wenn "JoinTable" Teil des Namens ist.

$ rails g migration CreateJoinTableUserPost user post

Wenn Sie die oben genannten Schritte ausführen, wird Folgendes generiert:

class CreateJoinTableUserPost < ActiveRecord::Migration[5.0]
  def change
    create_join_table :users, :posts do |t|
      # t.index [:user_id, :post_id]
      # t.index [:post_id, :user_id]
    end
  end
end

4-Ergänzung. Über Join-Tabellen (Join-Tabellen)

Generieren Sie bei Verwendung eine Join-Tabelle. In der Join-Tabelle werden "id: key" wie "Primärschlüssel" und "Fremdschlüssel" gespeichert.

#app/models/user.rb
class User < ActiveRecord::Base
   has_and_belongs_to_many :posts
end

#app/models/post.rb
class Post < ActiveRecord::Base
   has_and_belongs_to_many :users
end

@user.posts #-> all posts from join table
@post.users #-> all users from join table

Wenn Sie has_many <-> has_many zuordnen müssen, benötigen Sie eine Join-Tabelle, um alle Verweise auf die relativen externen Schlüssel zu speichern.

3-5 Generieren Sie ein Modell

Wenn Sie bei der Migration beim Erstellen eines neuen Modells die erforderlichen Spalten angeben, werden diese zusätzlichen Spalten gleichzeitig generiert.

Benutzermodell generieren


$ rails g model User name:string description:text

Wenn Sie die oben genannten Schritte ausführen, wird Folgendes generiert:

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
      t.text :description

      t.timestamps
    end
  end
end

3-6 Übergeben Sie den Modifikator

[Spaltenmodifikator](https://railsguides.jp/active_record_migrations.html#%E3%82%AB%E3%83%A9%E3%83%A0%E4%BF%AE%E9%A3%BE%E5 % AD% 90) kann auch direkt über die Befehlszeile übergeben werden. Feldtypen (Datentyp, Zuordnungstyp) können von hinten mit der wellenförmigen Klammer {} hinzugefügt werden.

$ rails g migration AddDetailsToProducts 'price:decimal{5,2}' supplier:references{polymorphic}

Dadurch wird eine Migration ähnlich der folgenden generiert:

class AddDetailsToProducts < ActiveRecord::Migration[5.0]
  def change
    add_column :products, :price, :decimal, precision: 5, scale: 2
    add_reference :products, :supplier, polymorphic: true
  end
end

4. Machen Sie Ihre eigene Migration

4-1. Erstellen Sie eine Tabelle

Die Methode "create_table" ist die grundlegendste Methode und wird beim Erstellen eines Modells verwendet.

create_table :posts do |t|
  t.string :name
end

Das Obige erstellt eine "Posts" -Tabelle und eine Spalte mit dem Namen "Name" darin. Wenn Sie den Primärschlüssel nicht verwenden möchten, können Sie die Option "id: false" angeben. Wenn Sie die von einer bestimmten Datenbank verwendeten Optionen benötigen, können Sie das SQL-Fragment wie folgt nach der Option: options schreiben.

create_table :products, options: "ENGINE=BLACKHOLE" do |t|
  t.string :name, null: false
end

In der obigen Migration wird ENGINE = BLACKHOLE in der SQL-Anweisung angegeben, die die Tabelle generiert.

Sie können auch die Option : comment verwenden, um eine Beschreibung der Tabelle zu schreiben und diese in der Datenbank selbst zu speichern. Es wird empfohlen, der Migration solche Kommentare hinzuzufügen, da dies das Datenmodell verständlicher macht und auch Dokumentation für große Anwendungen generiert.

4-2. Erstellen Sie eine Tabellenverknüpfung

Die Methode "create_join_table" der Migration erstellt einen HABTM-Tabellen-Join (has_and_belongs_to_many).

create_join_table :posts, :categories

Das Obige erstellt die Tabelle "category_products", in der die Spalten "category_id" und "post_id" erstellt werden. Diese Spalten haben die Option: null und der Standardwert ist false. Sie können den Standardwert überschreiben, indem Sie die Option : column_options angeben.

create_join_table :posts, :categories, column_options: { null: true }

Wenn Sie Ihren eigenen Tabellennamen verwenden möchten, können Sie ihn mit folgendem Namen angeben: tabellenname.

create_join_table :posts, :categories, table_name: :categorization

Die Kategorisierungstabelle wird auf die oben beschriebene Weise erstellt.

create_join_table kann auch einen Block als Argument verwenden. Dies wird verwendet, um Indizes und Spalten hinzuzufügen.

create_join_table :posts, :categories do |t|
  t.index :post_id
  t.index :category_id
end

4-3 Ändern Sie die Tabelle

Ändern Sie eine vorhandene Tabellechange_tableDie Methode istcreate_tableEs ist sehr ähnlich und kann auf die gleiche Weise verwendet werden. Ergib dich dem Block (des Blocks)|t|Das Objekt (das ersetzt) kann im folgenden Schreibstil verwendet werden.

change_table :posts do |t|
  t.remove :description, :name
  t.string :part_number
  t.index :part_number
  t.rename :upccode, :upc_code
end

Die obige Migration entfernt die Spalten "description" und "name", erstellt eine "string" -Spalte "part_number", fügt einen Index hinzu und benennt schließlich die Spalte "upccode" um.

4-4. Ändern Sie die Spalte

Für die Migration können Sie zusätzlich zu "remove_column" und "add_column" die Methode "change_column" verwenden.

change_column :products, :part_number, :text

Recommended Posts

Lesen Sie das Rails-Handbuch (Active Record Migration) erneut
Lesen Sie das Rails-Handbuch erneut (Übersicht über Action Controller).
[Rails] Löschen Sie die Migrationsdatei
Was ist Rails Active Record?
Überprüfen Sie den Migrationsstatus von Schienen
Schienenmigration
[Ruby on Rails] Informationen zum Active Record-Rückruf
[Rails] Active Record-Methode, die auch von Anfängern häufig verwendet wird
Ich habe den "Object-Oriented Practice Guide" gelesen, also ein Memorandum