#5 Using with_scope
W tym episodzie będziemy rozmawiać o metodzie with_scope
. Poniżej mamy model Task
(Zadanie), który posiada metodę klasową zwracającą wszystkie niekompletne zadania.
class Task < ActiveRecord::Base belongs_to :project def self.find_incomplete find_all_by_complete(false, :order => 'created_at DESC') end end
Ta metoda jest użyta w TasksController
.
class TasksController < ApplicationController def index @tasks = Task.find_incomplete end
Jest to lekkie ograniczenie, które nie pozwala nam na dodanie parametrów wyszukania do powyższej metody find
, w celu znalezienia pierwszych dwunastu niekompletnych zadań. To co chcemy osiągnąć wygląda tak:
@tasks = Task.find_incomplete :limit => 20
Jednym ze sposobów osiągnięcia tego jest dodanie hasha z opcjami do metody find_incomplete
w modelu i połączenie tych opcji z opcjami w metodzie find, jednak bardziej eleganckim rozwiązaniem jest użycie find_scope
, z hashem opcji.
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
Dowolna metoda find
wywołana z blokiem with_scope
będzie automatycznie dziedziczyć określone opcje. Teraz metoda find_incomplete
może przyjmować dowolne warunki. Takie rozwiązanie działa również z innymi scope
. Nasza metoda jest wywoływana w ProjectsController
. Możemy przekazać warunek limit
. Ta metoda find
korzysta z dwóch ograniczeń: najpierw dla określonego projektu znajdowane są niekompletne zadania, następnie są ograniczane do pierwszych dwunastu pozycji.
@tasks = @project.tasks.find_incomplete :limit => 20