homeASCIIcasts

5: Utiliser la méthode with_scope 

(view original Railscast)

Other translations: En It Es Kr

Other formats:

Written by Adrien Giboire (adriengiboire.com)

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 hast 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