Ось два зразкових коди.
Перший із 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
знаходиться на рівні db. Це буде лише запит конкретного поля. Дивіться це .
Коли ви робите:
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
id
використовуйте .ids
Ref doc: api.rubyonrails.org/classes/ActiveRecord/…
Так. Згідно з посібниками Rails , pluck
безпосередньо перетворює результат бази даних у array
без, будуючи ActiveRecord
об'єкти. Це означає кращу ефективність для великого або часто запущеного запиту.
На додаток до відповіді @ apneadiving, pluck
можна взяти за аргумент як імена одного, так і кількох стовпців:
Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
Якщо є випадок, коли ви використовуєте кілька атрибутів отриманого запису. У таких випадках слід використовувати pluck
.
User.collect(&:email)
У наведеному вище прикладі, якщо вам потрібен лише атрибут електронної пошти, ніж ви витрачаєте пам’ять та час. Оскільки він отримає всі стовпці з таблиці користувачів у базі даних, виділяє пам'ять для кожного атрибуту (включаючи атрибути, які ви ніколи не будете використовувати)
ПРИМІТКА: pluck
не повертає ActiveRecord_Relation користувача
pluck
декілька атрибутів, наприкладpluck(:id, :name)
?