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
En Rails, quelle convention lie le model User à quelle table ?
Apprendre l’IA, du premier prompt aux agents