• 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

Ce cours est en vidéo.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

J'ai tout compris !

Mis à jour le 23/10/2018

L’association de modèles

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Dans notre application, j’aimerais ranger les livres dans des catégories, que j’aurais au préalable créées dans la rails console. Voici comment faire à partir de vos connaissances.

Première étape, créer une nouvelle migration pour gérer nos catégories. Une catégorie aura un nom, soit « name » en anglais.

rails generate migration TableCategories

Complétez le fichier suivant et créez celui qui suit :

# db/migrate/*_table_categories.rb
class TableCategories < ActiveRecord::Migration
  def change
    create_table :categories
    add_column :categories, :name, :string
  end
end
# app/models/category.rb
class Category < ActiveRecord::Base
end

Puis dans le terminal, exécutez la migration :

rake db:migrate

Ne créez pas de contrôleur supplémentaire, à la place, créez des catégories dans la rails console :

Category.create name: "France"
Category.create name: "Monde"

Bien, les deux catégories sont créées. Mais comment relier des livres à une catégorie ? Le secret est de créer un nouvel attribut (une nouvelle colonne) dans la table livre et d’y stocker l’identifiant de la catégorie. Ainsi, à partir d’un livre, j’ai l’identifiant de la catégorie ; il n’y aura plus qu’à faire un Category.find.

rails generate migration AddCategoryIdToBooks

Je rappelle que c’est un choix d’appeler ma migration AddCategoryIdToBooks, cela fonctionnerait avec un autre nom.

# db/migrate/*_add_category_id_to_books.rb
class AddCategoryIdToBooks < ActiveRecord::Migration
  def change
    add_column :books, :category_id, :integer
    add_index :books, :category_id
  end
end

Pensez au rake db:migrate.

Par convention, un attribut permettant de se lier à une autre table porte le nom de cette table au singulier suivi de « _id ». Cet attribut est aussi appelé clé étrangère, car sa valeur est l’identifiant d’un élément d’une autre table.

Aussi, pour des raisons de performances, à chaque fois qu’un attribut associe deux tables, il faut préciser que ce dernier est un index.

Jusque là, ces préparatifs sont abstraits. Repassez sur la rails console pour concrétiser tout cela.

book = Book.new
book.title = "Initiation à Ruby on Rails"
book.category_id = 1
book.save

Un livre est créé et son category_id est 1. La première catégorie créée un peu plus tôt est la France. Vérifiez cela avec :

Category.find(book.category_id)

Voila, vous avez créé des catégories et associé un livre à l’une d’elles. Ici c’est sur un nouveau livre, mais rien ne vous empêche de mettre à jour les autres livres. Fondamentalement, rien de nouveau jusque ici.

Quittez la console et apportez ces modifications aux modèles :

# app/models/book.rb
class Book < ActiveRecord::Base
  belongs_to :category
end
# app/models/category.rb
class Category < ActiveRecord::Base
  has_many :books
end

belongs_to signifie « appartient à » ; has_many signifie « possède plusieurs ». Littéralement, cela se lit ainsi : « Un livre appartient à une catégorie » et « Une catégorie possède plusieurs livres ». Retenez les mots-clés belongs_to et has_many.

À quoi cela sert-il ? Retournez sur la rails console :

book = Book.last
book.category

category = Category.find(1)
category.books

Book.last permet de récupérer le dernier livre créé. La nouveauté est qu’il est possible de récupérer la catégorie d’un livre avec « book.category », et de récupérer la liste des livres d’une catégorie par « category.books ». Notez que « book » et « category » sont des variables dans mon exemple. Le code suivant aura le même effet :

Book.last.category
Category.find(1).books
Exemple de certificat de réussite
Exemple de certificat de réussite