ActiveRecord :select with :include
ActiveRecord is an important slice of the joy included in Ruby on Rails, writing a SQL database driven application without actually writing any SQL is really pleasurable.
But sometime, even in the joy you get some pain.
The pain for me arrived when I was working on some reporting feature that was pulling various data across a quite long chain of has_many relationships.
I experienced a quite high load in the DB at the moment of the query and after that seconds of CPU full load eaten by my ruby process.
I checked what was going on in my log/development.log and I noticed the query was extracting all the columns of every table even if I specified a :select option, this turned a query originally quite light into a heavy one.
I googled a bit and I found out that with ActiveRecord, if you specify :select and :include option you don't get anymore 100% joy but just 50%, your :select statement will be ignored.
Today I'm trying to put back some percent of the joy.
select_with_include gem is meant to move the joy level up to 80% (no, not 100% yet)
select_with_include will allow you to specify a limited :select statement like
"table1.column1, table1.column3, table2.column2"
or like
"table1.*, table2.column3, table2.column4, talbe3.*"
At the moment you can't specify functions or calculated fields. There are reason for that and I'm going to discuss these reason in the next posts. I'll try as well to explain how this gem works around the original ActiveRecord code.
For the moment you're invited to get select_with_include gem using
sudo gem install select_with_include
and test it yourself specifying
require 'select_with_include'
in your config/environment.rb file.
If you're a script/console user you can just try, while you
tail -f log/development.log
to launch the same find with :include and :select with and without requiring the gem.
If you find any issue you're really welcome to use the issue tracker
And if you want to know more just stay tuned for the next posts