#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 Tasks 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)


