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