mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Document a difference between pluck and select [ci skip]
Explain that `pluck` differs from `select` in that it does not construct `ActiveRecord` objects and thus model-level overrides are unavailable.
This commit is contained in:
parent
beb5ea8468
commit
956a27ccd6
1 changed files with 33 additions and 2 deletions
|
@ -1466,7 +1466,7 @@ Client.pluck(:id, :name)
|
||||||
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
|
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
|
||||||
```
|
```
|
||||||
|
|
||||||
`pluck` makes it possible to replace code like
|
`pluck` makes it possible to replace code like:
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
Client.select(:id).map { |c| c.id }
|
Client.select(:id).map { |c| c.id }
|
||||||
|
@ -1476,7 +1476,7 @@ Client.select(:id).map(&:id)
|
||||||
Client.select(:id, :name).map { |c| [c.id, c.name] }
|
Client.select(:id, :name).map { |c| [c.id, c.name] }
|
||||||
```
|
```
|
||||||
|
|
||||||
with
|
with:
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
Client.pluck(:id)
|
Client.pluck(:id)
|
||||||
|
@ -1484,6 +1484,37 @@ Client.pluck(:id)
|
||||||
Client.pluck(:id, :name)
|
Client.pluck(:id, :name)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Unlike `select`, `pluck` directly converts a database result into a Ruby `Array`,
|
||||||
|
without constructing `ActiveRecord` objects. This can mean better performance for
|
||||||
|
a large or often-running query. However, any model method overrides will
|
||||||
|
not be available. For example:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
class Client < ActiveRecord::Base
|
||||||
|
def name
|
||||||
|
"I am #{super}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Client.select(:name).map &:name
|
||||||
|
# => ["I am David", "I am Jeremy", "I am Jose"]
|
||||||
|
|
||||||
|
Client.pluck(:name)
|
||||||
|
# => ["David", "Jeremy", "Jose"]
|
||||||
|
```
|
||||||
|
|
||||||
|
Furthermore, unlike `select` and other `Relation` scopes, `pluck` triggers an immediate
|
||||||
|
query, and thus cannot be chained with any further scopes, although it can work with
|
||||||
|
scopes already constructed earlier:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
Client.pluck(:name).limit(1)
|
||||||
|
# => NoMethodError: undefined method `limit' for #<Array:0x007ff34d3ad6d8>
|
||||||
|
|
||||||
|
Client.limit(1).pluck(:name)
|
||||||
|
# => ["David"]
|
||||||
|
```
|
||||||
|
|
||||||
### `ids`
|
### `ids`
|
||||||
|
|
||||||
`ids` can be used to pluck all the IDs for the relation using the table's primary key.
|
`ids` can be used to pluck all the IDs for the relation using the table's primary key.
|
||||||
|
|
Loading…
Reference in a new issue