db / schema.rb
, um sie an die neueste Struktur der Datenbank anzupassen.
--Migration hat das Bild "Definieren der Aktion, die Sie ausführen möchten, wenn Sie sich in der Zeit vorwärts bewegen".20080906120001_add_details_to_products.rb
muss eine Klasse namens AddDetailsToProducts
definiert werden.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
$ 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.
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.
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
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.
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
[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
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.
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
Ändern Sie eine vorhandene Tabellechange_table
Die Methode istcreate_table
Es 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.
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