All guides
Intermediate-AdvancedSelf-pacedFree GuideSection 12/33

Migrations et Active Record ORM

Learn to build and check a web application with development tools and AI assistants. Practise design, coding and validation.

The full lessons for this course are currently available in French. Use the section menu to navigate the French course.

💡

Free content, available without an account. Tools and models change: use the current model guide to check their versions. Models and sources

Section 13.3.2 : Migrations et Active Record ORM

🎯 Objectif pédagogique

Comprendre Active Record, l'ORM de Rails qui transforme vos tables SQL en classes Ruby. Apprendre à créer et gérer des migrations pour faire évoluer votre schéma de base de données.


Qu'est-ce qu'un ORM ?

Un ORM (Object-Relational Mapping) fait le pont entre le monde objet (Ruby) et le monde relationnel (SQL). Au lieu d'écrire du SQL brut, vous manipulez des objets Ruby qui correspondent à des tables de la base de données.

# SANS ORM (SQL brut)
db.execute("SELECT * FROM users WHERE age > 25 ORDER BY name")

# AVEC Active Record (Ruby)
User.where('age > ?', 25).order(:name)

# Les deux produisent le même résultat SQL !

Les migrations : versionner votre base

Les migrations sont des fichiers Ruby qui décrivent les modifications de votre schéma de base. Elles permettent de versionner la structure de la DB comme vous versionnez votre code avec Git.

# Générer une migration
rails generate migration CreateUsers nom:string email:string age:integer

# Générer un model (crée le model ET la migration)
rails generate model User nom:string email:string age:integer
# db/migrate/20240315_create_users.rb
class CreateUsers < ActiveRecord::Migration[7.1]
  def change
    create_table :users do |t|
      t.string :nom, null: false
      t.string :email, null: false
      t.integer :age
      t.string :ville, default: 'Paris'
      t.timestamps  # created_at et updated_at automatiques
    end

    add_index :users, :email, unique: true
  end
end
# Exécuter les migrations
rails db:migrate

# Annuler la dernière migration
rails db:rollback

# Voir le statut
rails db:migrate:status

Ajouter/modifier des colonnes

# Ajouter une colonne
class AddBioToUsers < ActiveRecord::Migration[7.1]
  def change
    add_column :users, :bio, :text
    add_column :users, :avatar_url, :string
  end
end

# Supprimer une colonne
class RemoveVilleFromUsers < ActiveRecord::Migration[7.1]
  def change
    remove_column :users, :ville, :string
  end
end

# Renommer une colonne
class RenameNomToUsername < ActiveRecord::Migration[7.1]
  def change
    rename_column :users, :nom, :username
  end
end

CRUD avec Active Record

# CREATE
user = User.new(nom: 'Alice', email: 'alice@test.com', age: 28)
user.save

# Raccourci
user = User.create(nom: 'Bob', email: 'bob@test.com', age: 32)

# READ
User.all                          # Tous les utilisateurs
User.find(1)                      # Par ID (lève une erreur si absent)
User.find_by(email: 'alice@test.com')  # Par attribut (nil si absent)
User.where(ville: 'Paris')        # Collection filtrée
User.where('age > ?', 25)         # Avec condition SQL
User.order(age: :desc)            # Tri
User.limit(10).offset(20)         # Pagination
User.count                        # Nombre total
User.first                        # Premier
User.last                         # Dernier

# UPDATE
user = User.find(1)
user.update(age: 29)

# ou
user.nom = 'Alice Martin'
user.save

# DELETE
user.destroy
User.destroy_all                  # Tout supprimer

Requêtes avancées Active Record

# Chaîner les requêtes
User.where(ville: 'Paris')
    .where('age > ?', 25)
    .order(nom: :asc)
    .limit(10)

# Agrégation
User.average(:age)               # Âge moyen
User.maximum(:age)               # Âge max
User.minimum(:age)               # Âge min
User.count                       # Nombre total
User.group(:ville).count         # Compter par ville

# Pluck (récupérer une seule colonne)
User.pluck(:email)               # ['alice@test.com', 'bob@test.com']

# Exists?
User.exists?(email: 'alice@test.com')  # true
Loading diagram…
Quick Check

En Rails, quelle convention lie le model User à quelle table ?

Learn AI, from prompts to agents

15 free guidesQuizzes, diagrams and workshopsNo account needed

Your progress

Progress is self-reported and stored in your browser. The final completion record is not a qualification or an independent assessment.

View progress and completion record

Learn AI, from prompts to agents

15 free guidesQuizzes, diagrams and workshopsNo account needed

One practical AI workflow in your inbox

Methods, resources and new exercises. Free, unsubscribe at any time.