Hi All, I am having trouble getting the :include option to work on my active record finds. They are not eager loading, adding the joins to the sql queries. Has anyone had this problem? Here is my query: @cart = Cart.find_by_id(session[:cart_id], :include => [:cart_items]) This is generating the following query: SELECT * FROM `carts` WHERE (`carts`.`id` = 23) LIMIT 1 Rails is not eager loading the cart_items which belongs_to cart. Does anyone know why? Thanks, Sean --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
> Hi All, > I am having trouble getting the :include option to work on my active record > finds. They are not eager loading, adding the joins to the sql queries. Has > anyone had this problem? Here is my query: > > @cart = Cart.find_by_id(session[:cart_id], :include => [:cart_items]) > > This is generating the following query: SELECT * FROM `carts` WHERE > (`carts`.`id` = 23) LIMIT 1 > > Rails is not eager loading the cart_items which belongs_to cart. Does anyone > know why?Don''t think it can. Not in a single query. You have one cart that has many items. You can''t return all of that in a single query unless you want to send duplicate rows for the cart for every row of the cart item. There may be right after that line in the logs a line fetching the cart items. Or Rails might not do it since it''s not possible. If I''m thinking clearly that is :) --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Nah, that should work I think--see the "Eager Loading" section on http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethod s.html I just tried this out in a toy app of my own, and was surprised to see in my log that *in addition* to the left-join query immediately under the heading "Processing OrganizationsController#show", there were 3 other queries that followed the heading "Rendering organizations/show". One was triggered by (I think) this line in my view: <% if @organization.people.count > 0 %> That generated a: SELECT count(*) AS count_all FROM `people` WHERE (people.organization_id = 1) Then I have 2 instances of: SELECT * FROM `organizations` WHERE (`organizations`.`id` = 1) Which I believe are caused by resolving the person.organization.name calls in the part of the view that lists the people belonging to @organization. So... not that this isn''t a bit dismaying, BUT--is there any chance that you too are looking at calls generated not by your find_by_id call, but by subsequent view activity? Cheers, -Roy -----Original Message----- From: rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org [mailto:rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org] On Behalf Of Philip Hallstrom Sent: Friday, June 06, 2008 2:20 PM To: rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org Subject: [Rails] Re: help with :include on active record finds> Hi All, > I am having trouble getting the :include option to work on my active > record finds. They are not eager loading, adding the joins to the sql > queries. Has anyone had this problem? Here is my query: > > @cart = Cart.find_by_id(session[:cart_id], :include => > [:cart_items]) > > This is generating the following query: SELECT * FROM `carts` WHERE > (`carts`.`id` = 23) LIMIT 1 > > Rails is not eager loading the cart_items which belongs_to cart. Does > anyone know why?Don''t think it can. Not in a single query. You have one cart that has many items. You can''t return all of that in a single query unless you want to send duplicate rows for the cart for every row of the cart item. There may be right after that line in the logs a line fetching the cart items. Or Rails might not do it since it''s not possible. If I''m thinking clearly that is :) --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
I don''t think it has to do with view activity, because the cart and cart_items queries are generated by a before_filter.... and the are only run once. Plus, they are instantiating the @cart and it''s .cart_items children, so I don''t think any view methods would affect that. Maybe in your case you can call @organization.people.size to avoid the sql. There are other finds in my site that aren''t generating the eager loading queries like I would expect (and I believe rails used to, prior to rails 2.0.2). Here''s the kind of query I would expect rails to generated based on the find statement: mysql> select * from carts LEFT OUTER JOIN cart_items ON carts.id cart_items.cart_id WHERE carts.id = 23; +----+---------------------+---------------------+------+---------+------------+-----------+----------+ | id | created_at | updated_at | id | cart_id | product_id | option_id | quantity | +----+---------------------+---------------------+------+---------+------------+-----------+----------+ | 23 | 2008-06-06 16:13:17 | 2008-06-06 16:13:17 | 60 | 23 | 929 | NULL | 1 | | 23 | 2008-06-06 16:13:17 | 2008-06-06 16:13:17 | 61 | 23 | 933 | NULL | 1 | | 23 | 2008-06-06 16:13:17 | 2008-06-06 16:13:17 | 62 | 23 | 938 | NULL | 1 | +----+---------------------+---------------------+------+---------+------------+-----------+----------+ 3 rows in set (0.01 sec) I''m pretty sure rails used to do this. I find it strange that it no longer does. Thanks for the suggestions. On Fri, Jun 6, 2008 at 6:16 PM, Pardee, Roy <pardee.r-go57ItdSaco@public.gmane.org> wrote:> > Nah, that should work I think--see the "Eager Loading" section on > http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethod > s.html<http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html> > > I just tried this out in a toy app of my own, and was surprised to see > in my log that *in addition* to the left-join query immediately under > the heading "Processing OrganizationsController#show", there were 3 > other queries that followed the heading "Rendering organizations/show". > One was triggered by (I think) this line in my view: > > <% if @organization.people.count > 0 %> > > That generated a: > > SELECT count(*) AS count_all FROM `people` WHERE > (people.organization_id = 1) > > Then I have 2 instances of: > > SELECT * FROM `organizations` WHERE (`organizations`.`id` = 1) > > Which I believe are caused by resolving the person.organization.name > calls in the part of the view that lists the people belonging to > @organization. > > So... not that this isn''t a bit dismaying, BUT--is there any chance that > you too are looking at calls generated not by your find_by_id call, but > by subsequent view activity? > > Cheers, > > -Roy > > -----Original Message----- > From: rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org > [mailto:rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org] On Behalf Of Philip Hallstrom > Sent: Friday, June 06, 2008 2:20 PM > To: rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org > Subject: [Rails] Re: help with :include on active record finds > > > > Hi All, > > I am having trouble getting the :include option to work on my active > > record finds. They are not eager loading, adding the joins to the sql > > queries. Has anyone had this problem? Here is my query: > > > > @cart = Cart.find_by_id(session[:cart_id], :include => > > [:cart_items]) > > > > This is generating the following query: SELECT * FROM `carts` WHERE > > (`carts`.`id` = 23) LIMIT 1 > > > > Rails is not eager loading the cart_items which belongs_to cart. Does > > anyone know why? > > Don''t think it can. Not in a single query. You have one cart that has > many items. You can''t return all of that in a single query unless you > want to send duplicate rows for the cart for every row of the cart item. > > There may be right after that line in the logs a line fetching the cart > items. Or Rails might not do it since it''s not possible. > > If I''m thinking clearly that is :) > > > > > >--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
On Jun 6, 10:15 pm, "Sean O''Hara" <sean.ali...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hi All, > I am having trouble getting the :include option to work on my active record > finds. They are not eager loading, adding the joins to the sql queries. Has > anyone had this problem? Here is my query: >Eager loading in rails 2.1 changed: http://www.spacevatican.org/2008/4/29/include-and-conditions Fred --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Ah--you''re right about changing .count to .size. That does dissappear the count(*) query. Thanks! Like I say--I do get the LEFT JOIN query. It''s not as pretty as yours, but it''s there: SELECT `organizations`.`id` AS t0_r0, `organizations`.`name` AS t0_r1, `organizations`.`abbreviation` AS t0_r2, `organizations`.`city` AS t0_r3, `organizations`.`state` AS t0_r4, `organizations`.`crn_site` AS t0_r5, `organizations`.`created_at` AS t0_r6, `organizations`.`updated_at` AS t0_r7, `people`.`id` AS t1_r0, `people`.`first_name` AS t1_r1, `people`.`last_name` AS t1_r2, `people`.`birth_date` AS t1_r3, `people`.`organization_id` AS t1_r4, `people`.`created_at` AS t1_r5, `people`.`updated_at` AS t1_r6 FROM `organizations` LEFT OUTER JOIN `people` ON people.organization_id = organizations.id WHERE (`organizations`.`id` = ''1'') That''s with rails 2.0.2 and mysql. What''s your version & db? (There''s no chance that you left off the ''has_many :cart_items'' declaration in your cart class is there?) ________________________________ From: rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org [mailto:rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org] On Behalf Of Sean O''Hara Sent: Friday, June 06, 2008 3:27 PM To: rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org Subject: [Rails] Re: help with :include on active record finds I don''t think it has to do with view activity, because the cart and cart_items queries are generated by a before_filter.... and the are only run once. Plus, they are instantiating the @cart and it''s .cart_items children, so I don''t think any view methods would affect that. Maybe in your case you can call @organization.people.size to avoid the sql. There are other finds in my site that aren''t generating the eager loading queries like I would expect (and I believe rails used to, prior to rails 2.0.2). Here''s the kind of query I would expect rails to generated based on the find statement: mysql> select * from carts LEFT OUTER JOIN cart_items ON carts.id cart_items.cart_id WHERE carts.id = 23; +----+---------------------+---------------------+------+---------+----- -------+-----------+----------+ | id | created_at | updated_at | id | cart_id | product_id | option_id | quantity | +----+---------------------+---------------------+------+---------+----- -------+-----------+----------+ | 23 | 2008-06-06 16:13:17 | 2008-06-06 16:13:17 | 60 | 23 | 929 | NULL | 1 | | 23 | 2008-06-06 16:13:17 | 2008-06-06 16:13:17 | 61 | 23 | 933 | NULL | 1 | | 23 | 2008-06-06 16:13:17 | 2008-06-06 16:13:17 | 62 | 23 | 938 | NULL | 1 | +----+---------------------+---------------------+------+---------+----- -------+-----------+----------+ 3 rows in set (0.01 sec) I''m pretty sure rails used to do this. I find it strange that it no longer does. Thanks for the suggestions. On Fri, Jun 6, 2008 at 6:16 PM, Pardee, Roy <pardee.r-go57ItdSaco@public.gmane.org> wrote: Nah, that should work I think--see the "Eager Loading" section on http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethod s.html <http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMetho ds.html> I just tried this out in a toy app of my own, and was surprised to see in my log that *in addition* to the left-join query immediately under the heading "Processing OrganizationsController#show", there were 3 other queries that followed the heading "Rendering organizations/show". One was triggered by (I think) this line in my view: <% if @organization.people.count > 0 %> That generated a: SELECT count(*) AS count_all FROM `people` WHERE (people.organization_id = 1) Then I have 2 instances of: SELECT * FROM `organizations` WHERE (`organizations`.`id` = 1) Which I believe are caused by resolving the person.organization.name calls in the part of the view that lists the people belonging to @organization. So... not that this isn''t a bit dismaying, BUT--is there any chance that you too are looking at calls generated not by your find_by_id call, but by subsequent view activity? Cheers, -Roy -----Original Message----- From: rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org [mailto:rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org] On Behalf Of Philip Hallstrom Sent: Friday, June 06, 2008 2:20 PM To: rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org Subject: [Rails] Re: help with :include on active record finds > Hi All, > I am having trouble getting the :include option to work on my active > record finds. They are not eager loading, adding the joins to the sql > queries. Has anyone had this problem? Here is my query: > > @cart = Cart.find_by_id(session[:cart_id], :include => > [:cart_items]) > > This is generating the following query: SELECT * FROM `carts` WHERE > (`carts`.`id` = 23) LIMIT 1 > > Rails is not eager loading the cart_items which belongs_to cart. Does > anyone know why? Don''t think it can. Not in a single query. You have one cart that has many items. You can''t return all of that in a single query unless you want to send duplicate rows for the cart for every row of the cart item. There may be right after that line in the logs a line fetching the cart items. Or Rails might not do it since it''s not possible. If I''m thinking clearly that is :) --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
On 6 Jun 2008, at 22:20, Philip Hallstrom wrote:> >> Hi All, >> I am having trouble getting the :include option to work on my >> active record >> finds. They are not eager loading, adding the joins to the sql >> queries. Has >> anyone had this problem? Here is my query: >> >> @cart = Cart.find_by_id(session[:cart_id], :include => >> [:cart_items]) >> >> This is generating the following query: SELECT * FROM `carts` WHERE >> (`carts`.`id` = 23) LIMIT 1 >> >> Rails is not eager loading the cart_items which belongs_to cart. >> Does anyone >> know why? > > Don''t think it can. Not in a single query. You have one cart that > has > many items. You can''t return all of that in a single query unless you > want to send duplicate rows for the cart for every row of the cart > item. >That''s what Rails used to do :-) Fred> There may be right after that line in the logs a line fetching the > cart > items. Or Rails might not do it since it''s not possible. > > If I''m thinking clearly that is :) > > >--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---