ActiveRecord and multiple associations


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

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

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



With Rails release 1.1 I’ve started using has_many :xxxx, :through =>
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

class Person < ActiveRecord::Base
has_many :emails

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

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

class Email < ActiveRecord::Base
belongs_to :person

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

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

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs