homeASCIIcasts

4: Mover Find Dentro del Modelo 

(view original Railscast)

Other translations: En It Fr

Other formats:

Written by Aldo Escudero (aldoescudero.com.ar)

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