#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