Bird
Raised Fist0
Ruby on Railsframework~10 mins

Select and pluck in Ruby on Rails - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Select and pluck
Start with ActiveRecord Relation
↓
Call select(columns)
↓
Database query returns objects with selected columns
↓
Call pluck(column)
↓
Database query returns array of values for that column
↓
End
You start with a database query, use select to choose columns, then pluck to get an array of values from a column.
Execution Sample
Ruby on Rails
users = User.select(:id, :name)
names = users.pluck(:name)
Select returns user objects with only id and name; pluck returns an array of all user names.
Execution Table
StepActionQuery SentResult TypeResult Example
1Call User.select(:id, :name)SELECT id, name FROM usersActiveRecord::Relation (objects)[#<User id:1, name:"Alice">, #<User id:2, name:"Bob">]
2Call users.pluck(:name)SELECT name FROM usersArray of values["Alice", "Bob"]
3Use names arrayNo queryArray["Alice", "Bob"]
💡 No more queries; pluck returns array, select returns objects with selected columns.
Variable Tracker
VariableStartAfter Step 1After Step 2Final
usersnil[User objects with id and name][User objects unchanged][User objects with id and name]
namesnilnil["Alice", "Bob"]["Alice", "Bob"]
Key Moments - 2 Insights
Why does select return objects but pluck returns an array?
Select builds objects with only chosen columns (see execution_table step 1), while pluck directly fetches column values as an array (step 2).
Can I use pluck after select to get an array?
Yes, pluck can be called on the relation returned by select, and it will send its own query to fetch the specified column values as an array.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what type of result does User.select(:id, :name) return at step 1?
AArray of values
BSingle value
CActiveRecord objects with selected columns
DNil
💡 Hint
Check the 'Result Type' column in execution_table row for step 1.
At which step does the database return an array of names?
AStep 2
BStep 1
CStep 3
DNo step returns an array
💡 Hint
Look at the 'Result Type' and 'Result Example' columns in execution_table.
If you want an array of user ids, which method should you use?
AUser.select(:id).to_a
BUser.pluck(:id)
CUser.select(:id).pluck(:id)
DUser.all
💡 Hint
Refer to how pluck returns arrays directly in execution_table step 2.
Concept Snapshot
select(:columns) returns ActiveRecord objects with only those columns.
pluck(:column) returns an array of values for that column.
select builds objects; pluck fetches raw values.
pluck sends its own query, ignoring select.
Use pluck for simple arrays, select for partial objects.
Full Transcript
In Rails, select and pluck are ways to get data from the database. Select chooses which columns to include in the returned objects. For example, User.select(:id, :name) returns user objects with only id and name fields. Pluck gets an array of values for a single column, like User.pluck(:name) returns an array of all user names. Select returns ActiveRecord objects, pluck returns simple arrays. Pluck sends its own query and does not use select's columns. This means pluck is faster when you only want one column's values. Understanding this helps you write efficient queries and get the data format you want.

Practice

(1/5)
1. What is the main difference between select and pluck in Rails ActiveRecord?
easy
A. select returns all columns, pluck returns only the first column.
B. select returns model objects with selected columns, pluck returns an array of values.
C. select modifies the database, pluck deletes records.
D. select returns an array of values, pluck returns model objects.

Solution

  1. Step 1: Understand select behavior

    select loads model objects but only with the specified columns, so you still get ActiveRecord objects.
  2. Step 2: Understand pluck behavior

    pluck fetches column values directly from the database and returns them as a simple array, not objects.
  3. Final Answer:

    select returns model objects with selected columns, pluck returns an array of values. -> Option B
  4. Quick Check:

    Select = objects, Pluck = array [OK]
Hint: Select returns objects, pluck returns arrays of values [OK]
Common Mistakes:
  • Thinking pluck returns objects
  • Confusing select with all columns
  • Assuming select modifies data
2. Which of the following is the correct syntax to get an array of user emails using pluck?
easy
A. User.pluck(:email)
B. User.select(:email).pluck
C. User.pluck.email
D. User.select.pluck(:email)

Solution

  1. Step 1: Identify correct method usage

    pluck is called on the model with the column symbol as argument, like User.pluck(:email).
  2. Step 2: Check other options for syntax errors

    Options A, B, and C misuse method chaining or syntax and will cause errors.
  3. Final Answer:

    User.pluck(:email) -> Option A
  4. Quick Check:

    Correct pluck syntax = User.pluck(:column) [OK]
Hint: Use Model.pluck(:column) to get array of values [OK]
Common Mistakes:
  • Calling pluck without parentheses
  • Trying to chain pluck after select incorrectly
  • Using dot notation like pluck.email
3. Given the following code, what will be the output?
users = User.select(:id, :name).where(active: true)
names = users.pluck(:name)
medium
A. An error because pluck cannot be called after select
B. An array of all user names regardless of active status
C. An array of names of active users
D. An array of User objects with id and name

Solution

  1. Step 1: Analyze the query chain

    User.select(:id, :name).where(active: true) returns ActiveRecord objects with only id and name for active users.
  2. Step 2: Understand pluck on the relation

    Calling pluck(:name) on this relation fetches the name column values directly from the database for active users.
  3. Final Answer:

    An array of names of active users -> Option C
  4. Quick Check:

    Pluck after where filters data correctly [OK]
Hint: Pluck after where returns filtered column values [OK]
Common Mistakes:
  • Thinking pluck returns objects
  • Assuming pluck ignores where filters
  • Believing pluck cannot follow select
4. Identify the error in this code snippet:
users = User.pluck(:id, :name).select { |u| u.active? }
medium
A. No error, code works fine
B. Pluck cannot take multiple columns
C. Select cannot be called after pluck
D. Calling active? on array elements causes error

Solution

  1. Step 1: Understand what pluck returns

    pluck(:id, :name) returns an array of arrays like [[1, "Alice"], [2, "Bob"]], not User objects.
  2. Step 2: Check usage of active?

    Since elements are arrays, calling active? method on them causes a NoMethodError.
  3. Final Answer:

    Calling active? on array elements causes error -> Option D
  4. Quick Check:

    Pluck returns arrays, not objects [OK]
Hint: Pluck returns arrays, not objects with methods [OK]
Common Mistakes:
  • Assuming pluck returns objects
  • Trying to call model methods on pluck results
  • Thinking select after pluck filters objects
5. You want to get a list of unique active user emails efficiently. Which code snippet is best?
hard
A. User.where(active: true).pluck(:email).uniq
B. User.where(active: true).select(:email).map(&:email).uniq
C. User.select(:email).where(active: true).pluck(:email).uniq
D. User.pluck(:email).where(active: true).uniq

Solution

  1. Step 1: Analyze efficiency of each option

    User.where(active: true).select(:email).map(&:email).uniq loads objects with select then maps emails, which loads more data than needed.
  2. Step 2: Check correct chaining and method usage

    User.where(active: true).pluck(:email).uniq uses where to filter active users, then pluck to get emails directly from DB, then uniq to remove duplicates efficiently.
  3. Step 3: Identify errors in other options

    User.select(:email).where(active: true).pluck(:email).uniq is redundant but works; User.pluck(:email).where(active: true).uniq is invalid because pluck returns array, so where after pluck causes error.
  4. Final Answer:

    User.where(active: true).pluck(:email).uniq -> Option A
  5. Quick Check:

    Filter then pluck for efficiency [OK]
Hint: Filter with where, then pluck columns, then uniq [OK]
Common Mistakes:
  • Calling where after pluck (invalid)
  • Loading objects unnecessarily before pluck
  • Not removing duplicates efficiently
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard