aboutsummaryrefslogtreecommitdiffstats
path: root/guides/source
diff options
context:
space:
mode:
authorYves Senn <yves.senn@gmail.com>2013-09-05 00:56:03 -0700
committerYves Senn <yves.senn@gmail.com>2013-09-05 00:56:03 -0700
commit390aa7a0751ef00ff17e429587ca20833acf051d (patch)
treefcbc7b2cd3aae8055cd7d85906352609aa5a6a4b /guides/source
parent78befcfc287eae6dbfbd6287329b1cbcd9d77e3c (diff)
parent956a27ccd6aa119a5a64aa5714fc629c9d3317eb (diff)
downloadrails-390aa7a0751ef00ff17e429587ca20833acf051d.tar.gz
rails-390aa7a0751ef00ff17e429587ca20833acf051d.tar.bz2
rails-390aa7a0751ef00ff17e429587ca20833acf051d.zip
Merge pull request #12130 from egilburg/patch-1
Document a difference between pluck and select [ci skip]
Diffstat (limited to 'guides/source')
-rw-r--r--guides/source/active_record_querying.md35
1 files changed, 33 insertions, 2 deletions
diff --git a/guides/source/active_record_querying.md b/guides/source/active_record_querying.md
index ba0dc6d9eb..5aa935a155 100644
--- a/guides/source/active_record_querying.md
+++ b/guides/source/active_record_querying.md
@@ -1466,7 +1466,7 @@ Client.pluck(:id, :name)
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
```
-`pluck` makes it possible to replace code like
+`pluck` makes it possible to replace code like:
```ruby
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] }
```
-with
+with:
```ruby
Client.pluck(:id)
@@ -1484,6 +1484,37 @@ Client.pluck(:id)
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` can be used to pluck all the IDs for the relation using the table's primary key.