Вот два примера кода.
Первый с collect
:
User.first.gifts.collect(&:id)
Второй с pluck
:
User.first.gifts.pluck(:id)
Есть ли между ними разница в производительности или еще что-то?
источник
Вот два примера кода.
Первый с collect
:
User.first.gifts.collect(&:id)
Второй с pluck
:
User.first.gifts.pluck(:id)
Есть ли между ними разница в производительности или еще что-то?
pluck
находится на уровне БД. Он будет запрашивать только конкретное поле. Смотрите это .
Когда вы это сделаете:
User.first.gifts.collect(&:id)
У вас есть объекты со всеми загруженными полями, и вы просто получаете id
благодарность за метод, основанный на Enumerable.
Так:
если вам нужен толькоid
Rails 4, используйте ids
:User.first.gifts.ids
если вам нужны только некоторые поля с Rails 4, используйте pluck
:User.first.gifts.pluck(:id, :name, ...)
если вам нужно только одно поле с Rails 3, используйте pluck
:User.first.gifts.pluck(:id)
если вам нужны все поля, используйтеcollect
если вам нужны поля с Rails 4, все равно используйте pluck
если вам нужны поля с Rails 3, используйте select
иcollect
pluck
с несколькими атрибутами, напримерpluck(:id, :name)
?pluck
несколько полей, Rails 3 - нет, если вы не используете обходной путь Райана Лефевраid
, используйте.ids
Ref doc: api.rubyonrails.org/classes/ActiveRecord/…Да. Согласно руководствам Rails ,
pluck
напрямую преобразует результат базы данных в файлarray
, без созданияActiveRecord
объектов. Это означает лучшую производительность для большого или часто выполняемого запроса.В дополнение к ответу @apneadiving в
pluck
качестве аргумента может быть указано как одно, так и несколько имен столбцов:источник
Основное и главное отличие состоит в том, что Pluck применяется на уровне базы данных и собирает, получает все данные, а затем возвращает вам запись, когда вам нужно, чтобы все записи использовали сбор, а когда несколько полей, затем используйте pluck
источник
Если есть случай, когда вы используете несколько атрибутов полученной записи. В таких случаях вам следует использовать
pluck
.В приведенном выше примере, если вам нужен только атрибут электронной почты, вы тратите память и время. Поскольку он будет извлекать все столбцы из пользовательской таблицы в базе данных, выделяет память для каждого атрибута (включая атрибуты, которые вы никогда не будете использовать)
ПРИМЕЧАНИЕ:
pluck
не возвращает ActiveRecord_Relation пользователяисточник