#3 Find Through Association
In questa applicazione Rails c’è un modello Project che has_many tasks:
class Project < ActiveRecord::Base has_many :tasks end
e un modello Task che belongs_to un project:
class Task < ActiveRecord::Base belongs_to :project end
Nel controller dei modelli di progetto c’è un’action show. Vogliamo mostrare un Project, insieme con tutti i Task del progetto che sono incompleti. Per farlo, si esegue una find sulla classe di modello Task per recuperare i task che hanno lo stesso project_id del Project attuale e che hanno uno stato complete uguale a 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
C’è un modo migliore per fare ciò. Una find può essere eseguita attraverso un’associazione. La linea di codice che recupera i task può essere cambiata da
@tasks = Task.find(:all, :conditions => ['project_id = ? AND complete = ?', @project.id, false])
a
@tasks = @project.tasks.find(:all, :conditions => [complete = ?', false])
Questo significa che il project_id può essere rimosso dalla find poichè è già indicato implicitamente dal fatto che si passa attraverso l’associazione con il progetto.
Infine, la linea può ulteriormente essere accorciata usando una dynamic find:
@tasks = @project.tasks.find_all_by_complete(false)


