Qui sotto abbiamo una classe di modello Task
e vogliamo eseguire una find
per quel modello.
class TaskController < ApplicationController
def index
@tasks = Task.find_all_by_complete_(:false, :order => "created_at DESC")
end
end
Se la find
è ricorrente nell’applicazione, ci sarà duplicazione di codice. Un modo per eliminare questa ripetizione è quello di fattorizzare la find nel modello stesso, in un metodo statico, che ci consentirà di chiamare
@tasks = Task.find_incomplete
nel controller. Per fare ciò, come preannunciato, avremo bisogno di creare un nuovo metodo nel modello. Dovrà essere un metodo di classe, per cui inizierà con la keyword self
.
class Task < ActiveRecord::Base
belongs_to :project
def self.find_incomplete
find_all_by_complete_(:false, :order => "created_at DESC")
end
end
Non c’è bisogno di specificare Task
nella find
, poichè lo scope della find è già definito all’interno della classe Task
. Ora si può invocare Task.find_incomplete
ogni volta che ci sia bisogno di eseguire la find originale. Tutto ciò funzionerà anche in presenza di associazioni, per cui si potranno recuperare task incompleti di un Project
semplicemente così:
class ProjectsController < ApplicationController
def show
@project = Project.find(params[:id])
@tasks = @project.tasks.find_incomplete
end
end