#5 Using with_scope
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