homeASCIIcasts

5: Usare la with_scope 

(view original Railscast)

Other translations: En Es Kr Fr

Other formats:

Written by Andrea Salicetti

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