Thanks Phlip -

Thanks for the response - I'll play around with your suggestions.

What I was trying to do was something like this project.appointments to display 
all the appointments for a specific project.

The way I have it set up is that a project has many tasks, each task can have 
many resources  (people) and each resource then has appointments.  I'm not sure 
this is the best way to model but I thought it would be easier just keeping one 
reference to the project_id in the tasks table rather then trying to manage all 
the links back up to the projects table from the resources and appointments 
tables.  Maybe a bad design decision??





----- Original Message ----
From: Phlip <[EMAIL PROTECTED]>
To: rubyonrails-talk@googlegroups.com
Sent: Saturday, September 6, 2008 8:52:49 PM
Subject: [Rails] Re: Active record question


Mark Studebaker wrote:

> I'm not quite sure how to get at this data using Actrive record..  I'm 
> trying to get all the appointments made for a particular project.  I'm 
> using four models, Projects, Tasks, Resources and Appointments.
> 
> The SQL gets me what I'm looking for but how do I do it using Active Record?
> 
> Select a.* from appointments a
> join resources r on r.id = a.resource_id
> join tasks t on t.id = r.task_id
> join projects p on p.id = t.project_id
> Where project_id = 1;

Why is project joined in, if project_id comes from tasks?

And why is resources joined in? for its data? It does not participate in the 
links, right?

> I can get all the Resources for a project using this but can not get the 
> appointments.  I could loop through the resources getting all the 
> appointmen ts and tracking them, but that doesn't seem like the right 
> way to do it.  I could also use find_by_sql, but again, that does't seem 
> right. 
> 
> class Project < ActiveRecord::Base
>   has_many    :tasks
>   belongs_to  :customer
>   has_many    :resources, :through => :tasks

   Appointment.find( :all, :include => :tasks,
                         :conditions => { :'tasks.project_id' => 1} )

In summary, provide enough :has_many => :through to get to the keying table, 
then put it into your :include and :conditions.

Warning: :include will eager-load, which might slow you down with irrelevant 
data.

Alternately...

  Task.find_all_by_project_id(1).map(&:appointments).uniq

(-:

-- 
   Phlip



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to