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