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.
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
select(*fields) public method behaves in two distinct ways: one as an Array class method (
Array#select) method, the other one as a
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.
As an example, considering a Product model, let's retrieve records with only the
title field. It would look like this:
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.
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:
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)
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
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.
If you read the article, kudos! you did a great job. You can definitely celebrate!
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.