#3 Find Through Association
Nesta aplicação Rails temos uma model Project que contém has_many para tasks:
class Project < ActiveRecord::Base has_many :tasks end
e uma model Task que contém belongs_to para project:
class Task < ActiveRecord::Base belongs_to :project end
In the project’s controller method is a action. Nós Project, junto com todas Tasks no project que estão incompletas. To do this we perform a find on the Task tmodelo find tasks where the project_id matches the Project’s id and where the complete field is 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
Há um jeito melhor de fazer isso. Um find pode ser realizado através de uma associação. The line above that finds that tasks can be changed from
@tasks = Task.find(:all, :conditions => ['project_id = ? AND complete = ?', @project.id, false])
para
@tasks = @project.tasks.find(:all, :conditions => [complete = ?', false])
Isto significa que o project_id pode ser removido do find por já estar especificado ao fazer a busca através a task do project.
Esta linha pode ser diminuida ainda mais usando um método de busca dinâmico no corpo da model project desse jeito:
@tasks = @project.tasks.find_all_by_complete(false)


