I have a person model:
Person
has_many :phone_numbers
has_one :address
has_many :email_addresses
When I do the query:
people = Person.find(52, :include => [:address], :limit => 10)
How can I work out which associations we’re included.
i.e. in this case:
which_relationships_were_included(people) #=> [‘address’]
The reason I want to do this is so that I can automatically marshall
data in a specific format into javascript.
Alex M. wrote:
I have a person model:
Person
has_many :phone_numbers
has_one :address
has_many :email_addresses
When I do the query:
people = Person.find(52, :include => [:address], :limit => 10)
How can I work out which associations we’re included.
i.e. in this case:
which_relationships_were_included(people) #=> [‘address’]
The reason I want to do this is so that I can automatically marshall
data in a specific format into javascript.
I think the best way is to look at what happens when you load an
association.
person = Person.find(:first)
person.instance_variables == ["@attributes"]
person.address
person.instance_variables == ["@address", “@attributes”]
person = Person.find(:first, :include => :address)
person.instance_variables == ["@address", “@attributes”]
I know that worked with Rails 1.1.6
let me know if it doesnt in Rails 2
Matthew R. Jacobs wrote:
I think the best way is to look at what happens when you load an
association.
person = Person.find(:first)
person.instance_variables == ["@attributes"]
person.address
person.instance_variables == ["@address", “@attributes”]
person = Person.find(:first, :include => :address)
person.instance_variables == ["@address", “@attributes”]
I know that worked with Rails 1.1.6
let me know if it doesnt in Rails
Matthew: Works perfectly in rails 2.0, thankyou for the solution!
I spoke to soon …
So I can get a list of all the defined associations using:
assoc = model_instance.class.reflections.values.map {|r| ‘@’ +
r.name.to_s} & model_instance.instance_variables
assoc.map {|a| a[1…-1]}.map {|a|
model_instance.class.reflections[a.to_sym].class_name}
But the issue is when i have
people = Person.find(:all, :include => [:address,:suburb], :limit => 10)
give_me_a_list_of_all_the_included_attributes_including_those_in_relationships(people)
I can’t simply inspect people[0] and look at those relationships,
because if people[0] doesn’t have an address defined and people[1] does
the left join means that I won’t see the suburb defined.
I thought an easy solution would be to hack up ActiveRecord::Base.find
so that if an :include is passed, it stores that in each and every
instance of the model. That way I can just inspect the hash and easily
work out what was included.
The only other option I can think, is having my method
give_me_a_list_of_all_the_included_attributes_including_those_in_relationships
take another parameter which specifies the includes which in the long
run is not as easy for the end user.
i think you can do person.address.loaded?
On May 2, 5:08 pm, Matthew R. Jacobs <rails-mailing-l…@andreas-