ActiveRecord est l'ORM (Object-Relational Mapping) par défaut de Ruby on Rails, et il offre une manière élégante de manipuler les données de votre base de données. L'un des outils les plus puissants d'ActiveRecord est le concept de "scopes". Dans cet article, nous allons explorer ce que sont les scopes, comment les utiliser, et pourquoi ils peuvent rendre votre code plus propre et plus efficace.
Un scope dans ActiveRecord est une méthode qui encapsule une requête ActiveRecord. Cela vous permet de définir des requêtes réutilisables qui peuvent être facilement appelées dans votre code. Les scopes sont particulièrement utiles pour simplifier les requêtes complexes et pour améliorer la lisibilité de votre code.
Pour définir un scope dans un modèle ActiveRecord, vous utilisez la méthode scope
. Voici la syntaxe de base :
class NomDuModèle < ActiveRecord::Base
scope :nom_du_scope, -> { where(condition) }
end
Dans cet exemple, nom_du_scope
est le nom que vous allez utiliser pour appeler le scope, et condition
est la condition que vous souhaitez appliquer à votre requête.
Imaginons que vous ayez un modèle Article
et que vous souhaitiez créer un scope pour récupérer tous les articles publiés. Voici comment vous pourriez le faire :
class Article < ActiveRecord::Base
scope :publiés, -> { where(publié: true) }
end
Vous pouvez maintenant appeler ce scope dans votre code comme ceci :
Article.publiés
Une des caractéristiques les plus puissantes des scopes est la possibilité de les chaîner. Cela signifie que vous pouvez combiner plusieurs scopes pour créer des requêtes plus complexes. Par exemple, si vous souhaitez récupérer tous les articles publiés qui ont été créés après une certaine date, vous pouvez définir un autre scope :
class Article < ActiveRecord::Base
scope :publiés, -> { where(publié: true) }
scope :créés_après, ->(date) { where('created_at > ?', date) }
end
Vous pouvez ensuite chaîner ces scopes comme ceci :
Article.publiés.créés_après(Date.new(2023, 1, 1))
Les scopes peuvent également accepter des paramètres, ce qui les rend encore plus flexibles. Par exemple, vous pouvez créer un scope qui récupère des articles en fonction de leur catégorie :
class Article < ActiveRecord::Base
scope :par_catégorie, ->(catégorie) { where(catégorie: catégorie) }
end
Vous pouvez l'utiliser comme ceci :
Article.par_catégorie('Technologie')
Les scopes peuvent être combinés avec d'autres méthodes ActiveRecord pour créer des requêtes encore plus puissantes. Par exemple, vous pouvez utiliser order
pour trier les résultats :
Article.publiés.order(created_at: :desc)
Cette requête récupérera tous les articles publiés et les triera par date de création, du plus récent au plus ancien.
Voici quelques exemples pratiques de scopes que vous pourriez définir dans un modèle d'application typique :
class Utilisateur < ActiveRecord::Base
scope :actifs, -> { where(actif: true) }
scope :inactifs, -> { where(actif: false) }
scope :par_nom, ->(nom) { where('nom LIKE ?', "%#{nom}%") }
end
Avec ces scopes, vous pouvez facilement récupérer des utilisateurs actifs, inactifs ou rechercher des utilisateurs par leur nom.
Tester vos scopes est essentiel pour garantir qu'ils fonctionnent comme prévu. Voici un exemple de test RSpec pour le scope publiés
:
RSpec.describe Article, type: :model do
describe '.publiés' do
it 'retourne uniquement les articles publiés' do
article_publié = Article.create(titre: 'Article 1', publié: true)
article_non_publié = Article.create(titre: 'Article 2', publié: false)
expect(Article.publiés).to include(article_publié)
expect(Article.publiés).not_to include(article_non_publié)
end
end
end
Ce test vérifie que le scope publiés
retourne uniquement les articles qui ont été marqués comme publiés.
Les scopes dans ActiveRecord sont un outil puissant qui peut améliorer la lisibilité, la réutilisabilité et la testabilité de votre code. En encapsulant vos requêtes dans des méthodes réutilisables, vous pouvez rendre votre code plus propre et plus facile à maintenir. N'hésitez pas à expérimenter avec les scopes dans vos projets Rails et à les combiner pour créer des requêtes complexes.
Nous espérons que cet article vous a aidé à comprendre comment utiliser les scopes dans ActiveRecord. Si vous avez des questions ou des commentaires, n'hésitez pas à les partager !
© 2024 RailsInsights. All rights reserved.