#3 Find Through Association
Dans cette application Rails nous avons un modèle Project
qui a plusieurs (has_many
) tâches :
class Project < ActiveRecord::Base has_many :tasks end
et un modèle Task
lequel appartient à (belongs_to
) un projet :
class Task < ActiveRecord::Base belongs_to :project end
Dans le contrôleur du projet, la méthode est une action show
. Nous voulons afficher un Project
ainsi que toutes les tâches (Task
s) du projet qui ne sont pas complètes. Pour se faire, nous procédons à une recherche (find
) dans le modèle Task
pour trouver les tâches où le project_id
correspond à l'id du projet (Project
) et où le champ complete
est à 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
Il y a une meilleure façon de faire ça. Un find
peut être fait via une association. La ligne ci-dessus qui cherche les tâches peut être changée de
@tasks = Task.find(:all, :conditions => ['project_id = ? AND complete = ?', @project.id, false])
vers
@tasks = @project.tasks.find(:all, :conditions => [complete = ?', false])
Ceci signifie que le champ project_id
peut être enlevé du find
vu qu'il est déjà renseigné en faisant la recherche via les tâches du projet.
Cette ligne peut être raccourcie encore plus en utilisant une méthode find
dynamique dans le champ du modèle Project
de cette façon :
@tasks = @project.tasks.find_all_by_complete(false)