#3 Find Through Association
En esta aplicación Rails tenemos un modelo Project
(Proyecto) que has_many
(tiene_muchos/as) tasks
(tareas):
class Project < ActiveRecord::Base has_many :tasks end
y un modelo Task
que belongs_to
(pertenece_a) un project:
class Task < ActiveRecord::Base belongs_to :project end
En el controlador del modelo Project, hay una acción show
(mostrar). Queremos mostrar un Project
, así como también todos los Task
s en el project que están incompletos. Para ello, vamos a realizar un find
en el modelo Task
para encontrar tasks en las cuales su project_id
coincida con el id del Project
y en las que el campo complete
sean 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
Hay una mejor forma de hacer esto. Un find
puede realizarse a través de una asociación. La línea de arriba que busca las tareas, puede cambiarse por
@tasks = Task.find(:all, :conditions => ['project_id = ? AND complete = ?', @project.id, false])
por
@tasks = @project.tasks.find(:all, :conditions => [complete = ?', false])
Esto quiere decir que el project_id
puede ser eliminado del find
, por encontrarse ya definido al hacer un find a través de las tareas del proyecto.
Esta línea puede acortarse aún más, si usamos un método find dinámico
@tasks = @project.tasks.find_all_by_complete(false)