#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