[RUBY] Lisez à nouveau le guide Rails (Active Record Migration)

1. Qu'est-ce que la migration Active Record?

2. Présentation de la migration

3. Créez une migration

3-1. Migration lors de l'ajout / suppression de colonnes

--Lors de l'ajout d'une colonne
Générez en ajoutant ʻadd_columnau format "AddColumnToTable". <br> --Lors de la suppression d'une colonne <br> Générez en ajoutantremove_column` au format" RemoveColumnFromTable ".

Exemple: lors de l'ajout d'une colonne e-mail à la table Utilisateurs
$ rails g migration AddEmailToUsers email:string

Exemple: lors de la suppression d'une colonne hobby de la table Users
$ rails g migration RemoveHobbyFromUsers hobby:string

Lorsque la commande de génération de migration ci-dessus est exécutée, le fichier de migration suivant est généré.

Lors de l'ajout d'une colonne


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

Lors de la suppression d'une colonne


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

3-2. Migration lors de la génération d'une table

$ rails g migration CreatePosts name:string content:text

Faire ce qui précède générera:

Lors de la création d'une table


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

      t.timestamps
    end
  end
end

Le contenu généré jusqu'à présent n'est qu'un point de départ, Vous pouvez générer db / migrate / YYYYMMDDHHMMSS_add_genre_to_posts.rb et ajouter / supprimer des colonnes à la table.

3. Spécification des références

Vous pouvez spécifier des références comme type de colonne.

$ rails g migration AddUserRefToPosts user:references

L'exécution de ce qui précède générera:

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

L'exécution de cette migration crée un ʻuser_id` dans la table posts et ajoute l'index approprié.

3-4. Générer des tables de jointure`

La migration pour générer une table de jointure est également possible si "JoinTable" fait partie du nom.

$ rails g migration CreateJoinTableUserPost user post

L'exécution de ce qui précède générera:

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

Supplément 4. À propos des tables de jointure (join tables)

Générez une table de jointure lors de l'utilisation. La table de jointure stocke des «id: key» tels que «primaire» et «clé étrangère».

#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

Autrement dit, si vous devez associer has_many <-> has_many, vous avez besoin d'une table de jointure pour stocker toutes les références aux clés externes relatives.

3-5. Générer un modèle

Lors de la migration lors de la création d'un nouveau modèle, si vous spécifiez les colonnes requises, ces colonnes supplémentaires seront générées en même temps.

Générer un modèle utilisateur


$ rails g model User name:string description:text

L'exécution de ce qui précède générera:

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. Passez le modificateur

[Modificateur de colonne](https://railsguides.jp/active_record_migrations.html#%E3%82%AB%E3%83%A9%E3%83%A0%E4%BF%AE%E9%A3%BE%E5 Vous pouvez également passer% AD% 90) directement sur la ligne de commande. Les types de champs (type de données, type d'association) peuvent être ajoutés depuis l'arrière en utilisant la parenthèse ondulée {}.

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

Cela générera une migration similaire à la suivante:

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. Faites votre propre migration

4-1. Créer un tableau

La méthode create_table est la méthode la plus basique et est utilisée lors de la création d'un modèle.

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

Ce qui précède crée une table posts et y crée une colonne appelée nom. Si vous ne voulez pas utiliser la clé primaire, vous pouvez spécifier l'option ʻid: false`, et si vous voulez que les options soient utilisées par une base de données particulière, vous pouvez écrire le fragment SQL comme suit après l'option: options.

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

Dans la migration ci-dessus, ENGINE = BLACKHOLE est spécifié dans l'instruction SQL qui génère la table.

Vous pouvez également utiliser l'option : comment pour écrire une description de la table et la sauvegarder dans la base de données elle-même. Il est recommandé d'ajouter de tels commentaires à la migration car cela rendra le modèle de données plus facile à comprendre et générera également de la documentation pour les grandes applications.

4-2. Créer une jointure de table

La méthode create_join_table de la migration crée une jointure de table has_and_belongs_to_many (HABTM).

create_join_table :posts, :categories

Ce qui précède crée la table categories_products, dans laquelle les colonnes category_id et post_id sont créées. Ces colonnes ont une option: null et la valeur par défaut est false. Vous pouvez remplacer la valeur par défaut en spécifiant l'option : column_options.

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

Si vous souhaitez utiliser votre propre nom de table, vous pouvez le spécifier avec: nom_table.

create_join_table :posts, :categories, table_name: :categorization

La table de catégorisation est créée en procédant comme ci-dessus.

create_join_table peut également prendre un bloc comme argument. Ceci est utilisé pour ajouter des index et des colonnes.

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

4-3. Changer le tableau

Modifier une table existantechange_tableLa méthode estcreate_tableIl est très similaire et peut être utilisé de la même manière. Céder au bloc (du bloc|t|L'objet (qui remplace) peut être utilisé dans le style d'écriture suivant.

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

La migration ci-dessus supprime les colonnes description et name, crée une colonne string part_number, y ajoute un index et renomme finalement la colonne ʻupccode.

4-4. Changer de colonne

Lors de la migration, vous pouvez utiliser la méthode change_column en plus de remove_column et ʻadd_column`.

change_column :products, :part_number, :text

Recommended Posts

Lisez à nouveau le guide Rails (Active Record Migration)
Relisez le guide des rails (vue d'ensemble du contrôleur d'action)
[Rails] Supprimer le fichier de migration
Qu'est-ce que Rails Active Record?
Vérifier l'état de migration des rails
Migration des rails
[Ruby on Rails] À propos du rappel Active Record
[Rails] Méthode Active Record fréquemment utilisée même par les débutants
J'ai lu le "Guide pratique orienté objet", donc un mémorandum