ActiveRecord and multiple associations


#1

Hello,

I have a Company that has_and_belongs_to_many Persons. A Person
has_many Emails. I want to display each Person’s Email for each
Company, so I try this:

companies = Company.find(:all)
for company in companies
persons = company.persons
for person in persons
puts person.email
end
end

Unfortunately, this doesn’t work correctly. Let’s say the id of the
first company is 22, and the associated person’s id is 218.
ActiveRecord is retrieving from the Emails table where the owner =
22, NOT where the owner = 218, or the id of the Person.

Is this the way that ActiveRecord is supposed to work? I thought that
when I ask for an associated object, that object would be related to
the object that is associated to it, not an object higher up in the
hierarchy.

What’s the best work-around for this, or am I on the wrong path?

Thanks,

-Anthony


#2

With Rails release 1.1 I’ve started using has_many :xxxx, :through =>
:yyyy,
which helped me to avoid similar problems (especially with HABTM
definitions). So, nowadays I would set up your model in this way:

class Company < ActiveRecord::Base
has_many :employees
has_many :people, :through => :employees
end

class Person < ActiveRecord::Base
has_many :emails

has_many :employees
has_many :companies, :through => :employees
end

class Employee < ActiveRecord::Base
belongs_to :person
belongs_to :company
end

class Email < ActiveRecord::Base
belongs_to :person
end

With this setup, the query you’ve described should work.
There is one more thing … puts person.email won’t work, because this
statement doesn’t specify WHICH email has to be shown. So, instead,
either
you go through the whole array (for email in emails …) or something
like:
puts(person.emails.find(:first))

I’m quite new to Rails, but I hope that this can help.
Martin