Alex Chaffee's blog



Alex ChaffeeAlex Chaffee
Paranoia
edit Posted by Alex Chaffee on Saturday February 24, 2007 at 03:32PM

Hoping to improve performance, we changed a query to use the :include condition like this:

    Project.find(id, :include => :stories)

and we noticed two things:

  1. ActiveRecord decided to turn that into a LEFT OUTER JOIN. Egads! This drastically slowed things down (although we didn't notice until several days later, when we ran a real load test with production data).
  2. acts_as_paranoid did not manage to stick it's little "and deleted_at = nil" phrase into the query. This meant that "deleted" stories showed up when they weren't supposed to.

So that's two gotchas for the price of one.

In email, Nick pointed out that the joining behavior is documented and appropriate ("otherwise if there is a nil association (eg a project without any stories) you wouldn't get a project back even though it exists!") and Miho rejoined that AR can be dangerous because it changes what looks like beautiful, elegant Ruby into nasty, ugly, hard-to-understand SQL under the hood.

Alex ChaffeeAlex Chaffee
less color is more color
edit Posted by Alex Chaffee on Saturday February 10, 2007 at 12:06AM

Ever do "less log/development.log" and see the following?

ESC[4;35;1mSQL (0.001084)ESC[0m ESC[0mSET character_set_results = utf8;ESC[0m
ESC[4;36;1mSQL (0.001792)ESC[0m ESC[0;1mSHOW TABLESESC[0m

Wouldn't it be nicer to see the colorization like when you're tailing the log with tail -f? Try using -R:

less -R log/development.log

Then you'll see

SQL (0.001084) SET character_set_results = utf8;
SQL (0.001792) SHOW TABLES

A bit more legible, eh wot old chaps?

Works on Mac and Cygwin too.

And -X makes it not clear the screen when you stop less, so you get to keep seeing what you were just seeing.

So that means you may want to put

alias less="less -RX"

or

export LESS="-RX"

in your .bash_profile.

Also, if you don't want the fancy colors at all, specify

ActiveRecord::Base.colorize_logging = false

in your environment file (e.g. test.rb.) We're doing that in our test.rb so we can more clearly read the output from our CruiseControl build.