homeASCIIcasts

3: Chercher via une association 

(view original Railscast)

Other translations: En It Es

Other formats:

Written by Adrien Giboire (adriengiboire.com)

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)