Use of :include option in find query

Hi,
I have a Person model and Company model like as follows:-

Person.rb

class Person <ActiveRecord::Base
   has_one :company
end

Company.rb
class Company < ActiveRecord::Base
end

I have a function
def person_details
  @person=Person.find(params[:id, :include=> :company)
end

person_details.html.erb
<%=@person.name%> : <%=@person.company.name%>

I read that if you use the :include option then it reduces your number
of queries.
Means, whenever it is firing a query to find person same time it eager
loads the company association.

I am confused that what exactly it does? Is it load the company object
in memory? and instead of going to database it takes it from memory.

Can anyone elaborate me what exactly happens when we use the :include
option.

Thanks,
Mike

Write some code that uses your find and then accesses person.company
and look in the log to see the queries being used. Repeat without the
:include and you will see the difference.

Colin

Hi I have written code like this

1) Without :include
My code is :-
def user_details
    @user=User.find(params[:id])
    @company=@user.company
end
Log Output:-

Processing UsersController#user_details (for 127.0.0.1 at 2010-08-11
10:51:34) [GET]
  Parameters: {"id"=>"2"}
  User Columns (1.0ms) SHOW FIELDS FROM `users`
  User Load (0.4ms) SELECT * FROM `users` WHERE (`users`.`id` = 2)
  Company Load (0.4ms) SELECT * FROM `companies` WHERE
(`companies`.user_id = 2) LIMIT 1
Rendering template within layouts/users
Rendering users/user_details
Completed in 65ms (View: 48, DB: 2) | 200 OK
[http://localhost/user_xml?id=2]

2) With Include:-
def user_details
    @user=User.find(params[:id], :include=>:company)
    @company=@user.company
end
Log Output:-
Processing UsersController#user_details (for 127.0.0.1 at 2010-08-11
10:53:13) [GET]
  Parameters: {"id"=>"2"}
  User Columns (1.2ms) SHOW FIELDS FROM `users`
  User Load (0.5ms) SELECT * FROM `users` WHERE (`users`.`id` = 2)
  Company Load (0.3ms) SELECT * FROM `companies` WHERE
(`companies`.user_id = 2) LIMIT 1
Rendering template within layouts/users
Rendering users/user_details
Completed in 13ms (View: 2, DB: 2) | 200 OK
[http://localhost/user_xml?id=2]

If you look at the both o/p there is a query on company table in both
the cases.

What is the difference?

Thanks,
Mike

The queries will likely be the same.. but you should check to see if
it loaded the company details _before_ you called @user.company.

You might try the following from script/console while tailing the log
file in another terminal.

ruby script/console
=> User.find(2)

... check the log/development.log

=> User.find(2, :include => :company)

.... check log/development.log

Good luck!

Cheers,
Robby