homeASCIIcasts

4: Spostare le find ricorrenti nel modello 

(view original Railscast)

Other translations: En Es Fr

Other formats:

Written by Andrea Salicetti

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