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


