#5 Using with_scope
Dans cet épisode nous parlerons de with_scope. Ci-dessous un modèle Task qui a une méthode de classe qui retourne toutes les tâches incomplètes.
class Task < ActiveRecord::Base belongs_to :project def self.find_incomplete find_all_by_complete(false, :order => 'created_at DESC') end end
Cette méthode est utilisée dans TasksController.
class TasksController < ApplicationController def index @tasks = Task_find_incomplete end end
Ceci est quelque peu restreignant puisque nous ne pouvons ajouter de conditions à la méthode find personnalisée pour pour trouver, disons, les vingt premières tâches incomplètes. Ce que nous voulons faire ressemble à :
@tasks = Task_find_incomplete :limit => 20
Une façon de faire ça est d'ajouter un hash d'options à la méthode find_incomplete dans le modèle et le fusionner avec les options dans le find, mais une solution plus élégante existe avec with_scope, en transmettant les options de find.
class Task < ActiveRecord::Base belongs_to :project def self.find_incomplete(options = {}) with_scope :find => options do find_all_by_complete(false, :order => 'created_at DESC') end end end
N'importe quel find exécuté à l'intérieur du bloc with_scope héritera automatiquement des options spécifiées. Maintenant la méthode find_incomplete peut prendre n'importe quelles conditions transmises. Ceci fonctionnera aussi à l'intérieur d'un autre champ. Notre méthode personnalisée est appelée dans le contrôleur ProjectsController. Nous pouvons transmettre une condition de limite. Ce find traverses deux champs : d'abord les tâches incomplètes sont trouvées à l'intérieur du champ du projet spécifié et ensuite elles sont limitées aux vingt premières.
@tasks = @project.tasks.find_incomplete :limit => 20


