5: Usare la with_scope
Other formats:
In questo episodio parleremo di with_scope. Qui sotto è definito un modello Task che ha un metodo di classe che restituisce tutti i task incompleti.
class Task < ActiveRecord::Base
belongs_to :project
def self.find_incomplete
find_all_by_complete(false, :order => 'created_at DESC')
end
end
Questo metodo è usato nel controller TasksController.
class TasksController < ApplicationController
def index
@tasks = Task_find_incomplete
end
Tuttavia questa soluzione è un po’ limitante in quanto non si possono aggiungere eventuali ulteriori condizioni alla find, che specifichino, per esempio, che si vogliono solo i primi venti task incompleti. Ciò che vorremmo fare è qualcosa del genere:
@tasks = Task_find_incomplete :limit => 20
Un modo per farlo è di aggiungere come argomento un option hash al metodo find_incomplete nella classe di modello e fare il merge di tale hash con le option della find, ma c’è una soluzione più elegante con la find_scope, passando le opzioni alla 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
Ciascuna find eseguita all’interno del blocco with_scope erediterà automaticamente le opzioni indicate. Ora il metodo find_incomplete può accettare qualsiasi tipo di condizione fornito, valido per la find. Funzionerà anche con un altro scope. Il nostro metodo custom è richiamato all’interno di ProjectsController. Anche qui possiamo passare una condizione di limite. Questa find passa attraverso due scope: prima sono recuperati i task incompleti con lo scope del progetto specificato e secondariamente sono limitati ai primi venti.
@tasks = @project.tasks.find_incomplete :limit => 20




