Adding a :noselect option to ActiveRecord (Rails 2.3.x)
Let's say you have an users table with the following columns
firstname, lastname, email, crypted_password and salt
so you get all the records with:
User.find(:all) User.all #it calls find internallywell, you should know that ActiveRecord creates one instance of the User model for every record it founds and that every column of such records is stored in a instance variable of the User model instance.
now, let's say your table stores 2,000 users, ActiveRecord would create 2,000 instances of the User model and let's say your table have 15 columns, so each of this 2,000 instances of the User model will have 15 instances variables and at least 30 dynamic methods (setters and getters), so, it'd be a good idea if we can reduce, at least, the quantity of instance variables and setters and getters, don't you think?
well, for me, the first approach would be to check if I need all the columns, once I realize that I am not, I'd change the call, let's say I don't need the salt column:
User.all(:select => "firstname, lastname, email, crypted_password")let's benchmark! I'll use a table with 130 users.the results are:Only :all (3528.6ms):all with :select (3439.1ms)3439.1ms is less than 3528.6ms!! yes, milliseconds, but what about a table with thousands and thousands of users?ok, now let's say you have a table with 20 or 30 columns, can you imagine?User.all(:select => "col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_n")all of this just because you don't want one or two columns???well, I made a patch to add a :noselect option:User.all(:noselect => "salt")and it'll result in the same SQL query thanUser.find(:all, :select => "firstname, lastname, email, crypted_password")which means:SELECT firstname, lastname, email, crypted_password FROM usersAnd here is the link to the patch:
https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/4012-patch-add-noselect-option-to-activerecordfind