Active record question

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;

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
appointments 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

Any help would be greatly appreciated.

Mark S. wrote:

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

On Sep 7, 1:52 am, Phlip [email protected] wrote:

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.

In a situation like this :joins might be more appropriate - it will
write the joins but won’t do any of the stuff :include would

Fred

In a situation like this :joins might be more appropriate - it will
write the joins but won’t do any of the stuff :include would

Can you :joins => :leaf_records ? Or do you got to write all the raw
SQL?

On 7 Sep 2008, at 12:54, Phlip wrote:

In a situation like this :joins might be more appropriate - it will
write the joins but won’t do any of the stuff :include would

Can you :joins => :leaf_records ? Or do you got to write all the raw
SQL?

You can either pass raw sql or options in exactly the same format as
include takes them (eg :joins => [{:foo => {:bar =>
[:baz, :bam]}}, :bim])

Fred