Hi, I think this was a bit above my skills and patience. So if there isn't a easy fix I'll let this be for now and then see if I can skip using Class table inheritance or if I should change my code so it uses hashes instead of instances. Even though I think both those solutions are a bit ugly.
Thanks for you help! Cheers, Patrick On Wed, May 23, 2012 at 10:22 AM, Jeremy Evans <[email protected]>wrote: > On Wednesday, May 23, 2012 9:47:33 AM UTC-7, PatrickLef wrote: > >> Hi, >> >> I understand the problem. Do you think I can solve this in my application >> code without changing the db structure an without getting temp table? >> >> It's a quite large application and this is becoming a quite big problem >> when we are fetching bloggers based on info in the blog table. >> >> Would be great if you have any tips! >> > > If you really need the non-subselect query to work around MySQL's lousy > optimizer, you'll probably have to patch Sequel's Dataset#graph method not > to use the subselect and to handle the column aliasing differently. My > recommendation would be adding a method that, before adding any graph, you > could call with the initial column aliases: > > Blogger.set_initial_graph_aliases(:user_id=>:users, > :blogger_custom_field=>:bloggers).eager_graph(:blogs) > > This method would return a clone of the dataset with the necessary > metadata set. When initiating a graph, if this metadata has been set, it > won't use a subselect automatically, and will use the metadata instead of > setting up the initial graph aliases using the default code. One tricky > area is that you'll need to be able to specify that the > blogger_custom_field is aliased to bloggers in the SQL, but still belongs > to users when retrieving the graph. > > Alternatively, you could just not use eager graphing for this. You could > just use your custom SQL, and either not use associations at all, or setup > the associations manually. That may be easier. Blogger.one_to_one :blog, > so you shouldn't need to worry about combining multiple output rows into a > single object. You should just be able to do: > > bloggers = Blogger.with_sql(your_sql).map do |blogger| > h = {} > {:blog_id=>:blog_id, :blog_user_id=>:user_id, > :blog_custom_field=>:blog_custom_field}.each do |k, v| > h[v] = blogger.values.delete(k) > end > blogger.associations[:blog] = Blog.call(h) > blogger > end > > Jeremy > > -- > You received this message because you are subscribed to the Google Groups > "sequel-talk" group. > To view this discussion on the web visit > https://groups.google.com/d/msg/sequel-talk/-/6o5uVS5ZUlIJ. > > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/sequel-talk?hl=en. > -- // Patrick Lef -- You received this message because you are subscribed to the Google Groups "sequel-talk" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/sequel-talk?hl=en.
