hi, I have a table for example Product, and another table called Picture (Product has many pictures, Picture belongs to Product). Now let''s say that i want to retrieve all the Product and its related pictures, i do this with: @products = Product.find(:all, :include => :pictures) But in my case, i need to add a condition to the above code, like so: @products = Product.find(:all, :include => :pictures, :conditions => "pictures.main = 1") So, i will retrive all the products and its related MAIN pictures, but.....if one product does not have any picture, @products will not have that product, so i am unable to show the product, because it does not have any picture. Now Rails generate this sql for me SELECT `products`.`id` AS t0_r0, `products`.`name` , `product_pictures`.`id` AS t1_r0, `product_pictures`.`parent_id` AS t1_r1 FROM `products` LEFT OUTER JOIN `product_pictures` ON product_pictures.product_id = products.id WHERE (product_pictures.principal = 1) But why i really need is something like: SELECT `products`.`id` AS t0_r0, `products`.`name` , `product_pictures`.`id` AS t1_r0, `product_pictures`.`parent_id` AS t1_r1 FROM `products` LEFT OUTER JOIN `product_pictures` ON product_pictures.product_id = products.id AND product_pictures.principal = 1 Any idea of how can i do this? Regards --~--~---------~--~----~------------~-------~--~----~ 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 groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
On Feb 15, 10:36 am, fRAnKEnSTEin <shirkav...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> hi, > > I have a table for example Product, and another table called Picture > (Product has many pictures, Picture belongs to Product). Now let''s say > that i want to retrieve all the Product and its related pictures, i do > this with: > > @products = Product.find(:all, :include => :pictures) > > But in my case, i need to add a condition to the above code, like so: > > @products = Product.find(:all, :include => :pictures, :conditions => > "pictures.main = 1")If you create an association called main_pictures with the condition main=1 then Product.find :all, :include => :main_pictures should work (but only if you don''t cause activerecord to fall back to the old joins based :include). Fred> > So, i will retrive all the products and its related MAIN pictures, > but.....if one product does not have any picture, @products will not > have that product, so i am unable to show the product, because it does > not have any picture. Now Rails generate this sql for me > > SELECT `products`.`id` AS t0_r0, `products`.`name` , > `product_pictures`.`id` AS t1_r0, `product_pictures`.`parent_id` AS > t1_r1 FROM `products` LEFT OUTER JOIN `product_pictures` ON > product_pictures.product_id = products.id WHERE > (product_pictures.principal = 1) > > But why i really need is something like: > > SELECT `products`.`id` AS t0_r0, `products`.`name` , > `product_pictures`.`id` AS t1_r0, `product_pictures`.`parent_id` AS > t1_r1 FROM `products` LEFT OUTER JOIN `product_pictures` ON > product_pictures.product_id = products.id AND > product_pictures.principal = 1 > > Any idea of how can i do this? > > Regards--~--~---------~--~----~------------~-------~--~----~ 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 groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
This is almost exactly the same problem I was tackling last night. The workaround I found was a) specify the include in the find b) add conditions mentioning the included tables so the fetching is done in a single SQL statement instead of a separate statement for each association. As a part of this, make sure the condition doesn''t negate the point of your outer join c) use a bit of a hack to append your secondary condition to the join I think something like this might do the trick: @products = Product.find(:all, :include => :pictures, :joins => " AND pictures.main "+whatevervalue.to_s, :conditions "IFNULL(pictures.id,0)=IFNULL(pictures.id,0)") -Chris On Sun, Feb 15, 2009 at 7:36 AM, Frederick Cheung <frederick.cheung-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> > > > On Feb 15, 10:36 am, fRAnKEnSTEin <shirkav...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: >> hi, >> >> I have a table for example Product, and another table called Picture >> (Product has many pictures, Picture belongs to Product). Now let''s say >> that i want to retrieve all the Product and its related pictures, i do >> this with: >> >> @products = Product.find(:all, :include => :pictures) >> >> But in my case, i need to add a condition to the above code, like so: >> >> @products = Product.find(:all, :include => :pictures, :conditions => >> "pictures.main = 1") > > If you create an association called main_pictures with the condition > main=1 then Product.find :all, :include => :main_pictures should work > (but only if you don''t cause activerecord to fall back to the old > joins based :include). > > Fred >> >> So, i will retrive all the products and its related MAIN pictures, >> but.....if one product does not have any picture, @products will not >> have that product, so i am unable to show the product, because it does >> not have any picture. Now Rails generate this sql for me >> >> SELECT `products`.`id` AS t0_r0, `products`.`name` , >> `product_pictures`.`id` AS t1_r0, `product_pictures`.`parent_id` AS >> t1_r1 FROM `products` LEFT OUTER JOIN `product_pictures` ON >> product_pictures.product_id = products.id WHERE >> (product_pictures.principal = 1) >> >> But why i really need is something like: >> >> SELECT `products`.`id` AS t0_r0, `products`.`name` , >> `product_pictures`.`id` AS t1_r0, `product_pictures`.`parent_id` AS >> t1_r1 FROM `products` LEFT OUTER JOIN `product_pictures` ON >> product_pictures.product_id = products.id AND >> product_pictures.principal = 1 >> >> Any idea of how can i do this? >> >> Regards > > >--~--~---------~--~----~------------~-------~--~----~ 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 groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
On 15 feb, 13:18, Chris Warren <csw11...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> This is almost exactly the same problem I was tackling last night. The > workaround I found was > a) specify the include in the find > b) add conditions mentioning the included tables so the fetching is > done in a single SQL statement instead of a separate statement for > each association. As a part of this, make sure the condition doesn''t > negate the point of your outer join > c) use a bit of a hack to append your secondary condition to the join > > I think something like this might do the trick: > > @products = Product.find(:all, > :include => :pictures, > :joins => " AND pictures.main > "+whatevervalue.to_s, > :conditions > "IFNULL(pictures.id,0)=IFNULL(pictures.id,0)") > > -ChrisHi there, Thank you very much for your help, it just worked perfectly!!!!!. Regards --~--~---------~--~----~------------~-------~--~----~ 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 groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Hi there, The query works without the ":conditions => "IFNULL(pictures.id,0) =IFNULL(pictures.id,0)")" part. Why you put it? Regards --~--~---------~--~----~------------~-------~--~----~ 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 groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Hi, You situation may differ, but I found that the presence of a table in the conditions determined whether associations were loaded in a single query or multiple ones. 1. SELECT * FROM products SELECT * FROM pictures WHERE pictures.product_id IN (...) vs 2. SELECT * FROM products OUTER JOIN pictures ON ... I found (by looking at the log file) that without the conditions the pictures would be loaded in a separate query than the products(version 1), whereas tables mentioned in a condition would be included as a part of a single query (version 2 - Fredrick put me on that track). I didn''t do especially extensive testing. In my case I was doing Find(id) (using 2.2.2 on Windows) rather than Find(:all), and it''s entirely possible that :all uses a single query regardless of conditions or lack thereof. If it works for you without the :conditions, then I''d certainly vote for cutting them. -Chris On Mon, Feb 16, 2009 at 3:23 AM, fRAnKEnSTEin <shirkavand-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> > Hi there, > > The query works without the ":conditions => "IFNULL(pictures.id,0) > =IFNULL(pictures.id,0)")" part. Why you put it? > > Regards > > > > >--~--~---------~--~----~------------~-------~--~----~ 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 groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---