On 10/26/07, Josh S. [email protected] wrote:
returned by the query, the vast majority will not be used since they
What you are doing with your approach is an outer join (since that’s
how eager loading works). That includes all the result data for the
eagerly loaded records, which you’ll be dropping on the floor and
ignoring. That’s making the database work a lot more for no reason.
SELECT posts.* FROM posts
INNER JOIN comments ON post.id = comments.post_id
INNER JOIN authors ON comment_id = authors.id
WHERE authors.name = ‘Bob Dobbs’;
It’s a radically different approach than yours in how you’d do it in
ActiveRecord code, so it might not be something you want to take on.
If not, I might give it a shot in my copious spare time.
Well your SQL foo is no doubt stronger than mine, but in my use case I
tried :join and it didn’t work.
Here’s my motivating case:
I’ve got one model called Item which has_many Schedules. Schedules
have a start-time.
There are LOTS or schedules.
I’m trying to get all of the Items which have at least one Schedule
which hasn’t yet started, the purpose of this is to populate a
Once one of those is selected, the list of schedules owned by that
Item is presented for selection.
So, it was suggested to me here that
Items.find(:all, :include => :schedules :conditions =>
[“schedules.begin_date >= ?”, horizon_time]
was the best way to do this.
It works, but since there are many, many schedules in this database,
instantiating all their AR objects is costly in time and space.
Now I tried substituting :joins and doing an inner join. The result
was that I got duplicate AR objects for my Items.
The deal is that when you use :include, AR does the query, and then
iterates over the result and instantiates only one object for each
unique row in the first table. It then adds the objects for the
included tables to the associations.
The join option does the query and just builds one AR object from each
row of the result which isn’t what I need.
Disclaimer: It’s late on a Friday. Take what I say with a few grains
It’s even later here, (you are on the west coast aren’t you. )
My blog on Ruby