homeASCIIcasts

5: Uso de with_scope 

(view original Railscast)

Other translations: En It Kr Fr

Other formats:

Written by Aldo Escudero (aldoescudero.com.ar)

En este episodio hablaremos acerca de with_scope. Debajo vemos el modelo Task tiene un método de clase que devuelve todas las tareas incompletas.

class Task < ActiveRecord::Base  
  belongs_to :project  
  
  def self.find_incomplete  
    find_all_by_complete(false, :order => 'created_at DESC')  
  end  
end  

Este metodo es utilizado en TasksController.

class TasksController < ApplicationController  
  def index  
    @tasks = Task.find_incomplete  
  end  

Esto es un poco limitante, ya que no podemos especificar condiciones al método find. Por ejemplo, buscar las primeras veinte tareas incompletas. Lo que queremos hacer es algo como lo siguiente

@tasks = Task.find_incomplete :limit => 20  

Una manera de hacer esto, sería agregar un hash de opciones al método find_incomplete en el modelo y combinarlo con las opciones en el find. Pero podemos obtener una solución más elegante con with_scope al pasarle las opciones del 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  

Todo find que se ejecute dentro del bloque with_scope, automáticamente heredara las opciones especificadas. Ahora find_incomplete puede tener cualquier condición que reciba. Esto también funcionará dentro de otro scope (alcance). Nuestro método personalizado es llamado en ProjectsController. Por ejemplo, podemos pasar una condición limit. Este find pasa a través de dos scopes: en el primero, las tareas incompletas son encontradas dentro del scope del proyecto especificado, y en el segundo, se limitan solamente a las primeras veinte.

@tasks = @project.tasks.find_incomplete :limit => 20