Poniżej mamy model Task
(Zadanie) i wywołujemy metodę find
(szukaj) na tym modelu.
class TaskController < ApplicationController
def index
@tasks = Task.find_all_by_complete(:false, :order => "created_at DESC")
end
end
Jeśli metoda find
jest wywołana klika razy w aplikacji, występuje wtedy efekt duplikacji. Jednym ze sposobów wyeliminowania duplikacji jest przeniesienie metody find
do modelu, który możemy wywołać poprzez
@tasks = Task.find_incomplete
w kontrolerze. Aby można było tak zrobić musimy stworzyć nową metodę w modelu. Metoda musi być metodą klasową, w związku z tym, nazwę metody musimy poprzedzić słowem self
.
class Task < ActiveRecord::Base
belongs_to :project
def self.find_incomplete
find_all_by_complete(:false, :order => "created_at DESC")
end
end
Nie ma potrzeby używać słowa Task
(Zadanie) przed metodą find
, ponieważ w klasie Task
(Zadanie) metoda find
jest automatycznie ograniczana dla tej klasy. Teraz możesz wywołać Task.find_incomplete
, w momencie kiedy chcesz wywołać, wspomnianą w tym epizodzie, metodę find
. Będzie to działać nawet z relacjami, więc możesz znaleźć niekompletne zadania projektu w ten sposób:
class ProjectsController < ApplicationController
def show
@project = Project.find(params[:id])
@tasks = @project.tasks.find_incomplete
end
end