#3 Find Through Association
W tej Railsowej aplikacji mamy model Project
(Projekt), który has_many
(ma wiele) zadań:
class Project < ActiveRecord::Base has_many :tasks end
i model Task
(Zadanie), który belongs_to
(należy do) projektu:
class Task < ActiveRecord::Base belongs_to :project end
W kontrolerze projektów mamy akcję show
. Chcemy wyświetlić Project
(Projekt), ze wszystkimi Tasks
(Zadaniami) projektu, które są niekompletne. W celu wykonania tego wywołujemy metodę find
na modelu Task
(Zadania) w celu znalezienia zadań, gdzie project_id
pasuje do Project
(id projektu) i gdzie pole complete
ma wartość false
:
class ProjectsController < ApplicationController def show @project = Project.find(params[:id]) @tasks = Task.find(:all, :conditions => ['project_id = ? AND complete = ?', @project.id, false]) end end
Istnieje jednak lepsza droga do uzyskania pożądanego efektu. Metoda find
może być wywowałna za pośrednictwem asocjacji. Druga linijka może być zmieniona z
@tasks = Task.find(:all, :conditions => ['project_id = ? AND complete = ?', @project.id, false])
na
@tasks = @project.tasks.find(:all, :conditions => [complete = ?', false])
To oznacza, że pole project_id
może być usunięte z metody find
ponieważ określamy to poprzez wywołanie metody find za pośrednictwem relacji.
Linijka ta może być jeszcze bardziej skrócona poprzez użycie dynamicznej metody find na ograniczonej, przez model projektu, liczbie zadań:
@tasks = @project.tasks.find_all_by_complete(false)