it-roy-ru.com

В чем разница между сборкой и сборкой в ​​Rails?

Вот два примера кода.

Первый с collect:

User.first.gifts.collect(&:id)

Второй с pluck:

User.first.gifts.pluck(:id)

Есть ли разница между ними в производительности или что-то еще?

109
Mohit Jain

pluck находится на уровне БД. Он будет запрашивать только конкретное поле. Видеть это .

Когда вы делаете:

 User.first.gifts.collect(&:id)

У вас есть объекты со всеми загруженными полями, и вы просто получаете id благодаря методу, основанному на Enumerable.

Так:

  • если вам only нужен id с Rails 4, используйте ids: User.first.gifts.ids

  • если вам only нужны некоторые поля в Rails 4, используйте pluck: User.first.gifts.pluck(:id, :name, ...)

  • если вам only нужно одно поле с Rails 3, используйте pluck: User.first.gifts.pluck(:id)

  • если вам нужны поля all, используйте collect

  • если вам нужны некоторые поля с Rails 4, по-прежнему используйте pluck

  • если вам нужны некоторые поля с Rails 3, используйте select и collect

205
apneadiving

Да. Согласно руководствам Rails , pluck напрямую преобразует результат базы данных в array, не создавая ActiveRecord объекты. Это означает лучшую производительность для большого или часто выполняющегося запроса.

В дополнение к ответу @ apneadiving, pluck может принимать в качестве аргумента как одно, так и несколько имен столбцов:

Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
22
Numbers

Основное и основное отличие заключается в том, что Pluck применяется на уровне базы данных и собирает все данные, а затем возвращает запись вам Когда вам нужно, чтобы все записи использовали сбор и когда мало полей, то используйте pluck

2
Thorin

Если есть случай, когда вы используете несколько атрибутов найденной записи. В таких случаях вы должны использовать pluck.

User.collect(&:email)

В приведенном выше примере, если вам нужен только атрибут электронной почты, чем вы тратите впустую память и время. Поскольку он извлекает все столбцы из пользовательской таблицы в базе данных, выделяет память для каждого атрибута (включая атрибуты, которые вы никогда не будете использовать) 

ПРИМЕЧАНИЕ: pluck не возвращает ActiveRecord_Relation пользователя

0
Chimed Palden