In Rails, pluck is a shortcut to select one or more attributes without loading the corresponding records just to filter out the selected attributes. It returns an Array of attribute values. Person.
Prefer pluck instead of map As with select , map will load the order into memory and it will get the id attribute. Using pluck will be faster, because it doesn't need to load an entire object into memory. For this particular case, pluck is six times faster than map .
pluck
is on the db level. It will only query the particular field. See this.
When you do:
User.first.gifts.collect(&:id)
You have objects with all fields loaded and you simply get the id
thanks to the method based on Enumerable.
So:
if you only need the id
with Rails 4, use ids
: User.first.gifts.ids
if you only need some fields with Rails 4, use pluck
: User.first.gifts.pluck(:id, :name, ...)
if you only need one field with Rails 3, use pluck
: User.first.gifts.pluck(:id)
if you need all fields, use collect
if you need some fields with Rails 4, still use pluck
if you need some fields with Rails 3, use select
and collect
Yes. According to Rails guides, pluck
directly converts a database result into an array
, without constructing ActiveRecord
objects. This means better performance for a large or often-running query.
In addition to @apneadiving's answer, pluck
can take both single and multiple column names as argument:
Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
The basic and main difference is that Pluck applies on db level and collect get all data and then return record to you when you need all records use collect and when few fields then use pluck
If there is a case where you are using few attributes of the retrieved record. In such cases you should use pluck
.
User.collect(&:email)
In above example if you only need email attribute than you are wasting memory and time. Because it will retrieve all the columns from user table in the database, allocates the memory for each attributes (including the attributes which you will never use)
NOTE: pluck
does not return ActiveRecord_Relation of the user
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With