5: Uso de with_scope
Other formats:
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




