Exclude Fields from Eager Loaded Models

I made a patch to allow eager loading to exclude specified columns on the eagerly-loaded models. If you have a model that you want to load for a specific reason – like, say, you have lots of users, and you want to grab all their posts but exclude the posts’ bodies – you can now specify that by going:

User.find(:all, :include => {:posts => {:except => :body}})

I found this useful in my application when I was trying to grab a huge amount of emails and didn’t want to include their bodies. Without body loading, the emails loaded in a a few milliseconds: with the bodies included they took lots longer.

The ticket for this change is here: https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/3662-exclude-fields-from-eager-loaded-models

Isn't this already supported syntax (which would load the :except
association for posts and the :body association for excepts)? Not
that I think having an association named :except is a good idea, but
it's something to consider.


This isn’t necessarily a problem. If you have an association named :except you can still eagerly load it using either the array syntax:

User.find(:all, :include => [:comments, :except])

Or just the regular symbol notation:

User.find(:all, :include => :except)

If you include it in the hash notation though, it definitely will think you’re going to specify column names to remove from the select:

User.find(:all, :include => {:comments => :except})

Will now bomb out, where before it would assume that you want to include comments and then include except on comments, like you said. In making the patch I figured the amount of people who would be helped by the performance improvements probably outweighs the number of people who have associations named “except.” But hey, I could be wrong.


I read the Rails 3 Beta call email and I wanted to try to raise this ticket again to maybe get it a bit more visibility before the beta comes out. Anyone feel like commenting on this patch? I’ve found it helpful, anyway!

I don't believe this should be in core for a few reasons :

1) It's not needed very often
2) Difficult to make it work with eager loading. Your patch only deals
with preloading.
3) I'd prefer using a plugin like http://github.com/mcmire/ar_attr_lazy/