#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)