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
<%[email protected]%> : <%[email protected]%>

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

On 10 August 2010 13:44, Mike D. [email protected] wrote:

<%[email protected]%> : <%[email protected]%>

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.

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])
    @[email protected]
    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]

  1. With Include:-
    def user_details
    @user=User.find(params[:id], :include=>:company)
    @[email protected]
    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