Debajo, tenemos un modelo Task, en el que estamos realizando un find.
class TaskController < ApplicationController
def index
@tasks = Task.find_all_by_complete_(false, :order => "created_at DESC")
end
end
Si el find se esta realizando varias veces a través de la aplicación entonces vamos a estar generando duplicación. Una manera de eliminar esta duplicación sería mover el find dentro del modelo, lo que nos permitiría llamar
@tasks = Task.find_incomplete
en el controlador. Para esto, tendremos que crear un nuevo método en el modelo. El método debe ser un método de clase, por lo que deberá comenzar con self.
class Task < ActiveRecord::Base
belongs_to :project
def self.find_incomplete
find_all_by_complete_(false, :order => "created_at DESC")
end
end
No hay necesidad de especificar Task en la línea donde realizamos el find, ya que el find se encuentra dentro del scope (alcance) de la clase Task. Ahora puede llamar Task.find_incomplete cuando necesite realizar ese find. Incluso, funcionará en asociaciones para que pueda realizar búsquedas de tareas incompletas del Proyecto de la siguiente forma:
class ProjectsController < ApplicationController
def show
@project = Project.find(params[:id])
@tasks = @project.tasks.find_incomplete
end
end