3: Chercher via une association
Other formats:
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 (Tasks) 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)



