Mastering the Select Method in Rails: A Comprehensive Guide [Part I]

Greeting

Hey guys, how've you been? It's AC, Alexandre Calaça here. Hope you enjoy this new article.

By the way, I would be glad to receive your feedback about it.


Introduction

This article Mastering the Select Method in Rails: A Comprehensive Guide - Part I focuses on how to use the Active Record Select method.

It's important to remember that the select method can also be used as an Array class method (Array#select).

So, just to make sure we're on the same page, this article is not going to cover about how to use the Array#select method.


The Select Method

The select(*fields) public method behaves in two distinct ways: one as an Array class method (Array#select) method, the other one as a ActiveRecord::QueryMethods.

In Rails, the select method is used to retrieve a collection of objects from the database that meet certain conditions specified in the method. This is going to become easier as you read this article.

Syntax

Model.select(:field)

or

Model.select("field")

As an example, considering a Product model, let's retrieve records with only the title field. It would look like this:

Product.select(:title)

or

Product.select("title")

We could also retrieve these records with some conditions. Take a look.

Product.select(:name, :status).where('price < ?',  40)

In this case, the keyword ẁhere was added in order to apply our condition.

Parameters

If we check the source code, it's noticeable that the select(*fields) uses the splat operator in the argument section. In that case, when we provide arguments, they're going to be converted into an array.

splat operators might be covered later in another article. So far, we just need to understand that we can provide an array or a bunch of arguments separated by comma.

In Rails 3, the select method expects a single argument, which is an array of column names or SQL fragments to select. In case you want to try anyway, the error message would look something like this:

ArgumentError: wrong number of arguments (2 for 0..1)
from /home/alexandre/.rbenv/versions/2.1.6/lib/ruby/gems/2.1.0/gems/activerecord-3.2.11/lib/active_record/relation/query_methods.rb:70:in `select

In order to provide multiple values in Rails 3, using the select method, an array needs to be used as an argument, due to the splat operator:

Product.select(["type", "status"])

When you pass multiple arguments, Rails 3 interprets them as individual arguments instead of an array, hence the error message.

In Rails 4 and above, the select method can accept multiple arguments:

Product.select("type", "status")
Product.select(:type, :status)

Return

In a successful case scenario, a new Active Record relation is returned containing all elements for which the given block was provided.

selected_products = Product.select(:id, :name).where('price < ?',  10)
[...]
=> #<#<Class:#<ActiveRecord::Relation:0x00563b47398680>>:0x2b1da39cc340>

In the previous code, we would see a list of products that are cheaper than 10, only id and name fields are retrieved.

When the criteria specified in the select method are not met, the method returns an empty ActiveRecord::Relation object.

products = Product.select(:name).where('price > ?', 1.00)
=> #<ActiveRecord::Relation []>

products.empty?
=> true

Summary

In this article, we learned how to use the ActiveRecord::QueryMethods select method.

We understood how the select method works differently as an Array class method (Array#select) and as a ActiveRecord::QueryMethods.

We also compared how some characteristics of the method have changed during the release of new Rails versions, especially with regards to parameters and returns.


Celebrate

If you read the article, kudos! you did a great job. You can definitely celebrate!


Conclusion

That's all for today. Thanks for reading the article Mastering the Select Method in Rails: A Comprehensive Guide [Part I].

I hope this article helped you. Let me know if you have any questions.

Your thoughts, suggestions and corrections are more than welcome.

By the way, feel free to drop your suggestions on new blog articles.

Hope to see you next time.