Яка різниця між збиванням та збиранням у Rails?


123

Ось два зразкових коди.

Перший із collect:

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

Другий з pluck:

User.first.gifts.pluck(:id)

Чи є різниця між ними у виконанні чи щось інше?

Відповіді:


230

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


"якщо вам потрібні деякі поля, використовуйте selectand collection" - хіба ви не можете просто використовувати pluckдекілька атрибутів, наприклад pluck(:id, :name)?
Олександр

@AlexPopov - Rails 4+ підтримує pluckдекілька полів, Rails 3 не виконує, якщо ви не
вирішите

3
Якщо вам потрібен лише Rails 4, idвикористовуйте .idsRef doc: api.rubyonrails.org/classes/ActiveRecord/…
Іван Чау

30

Так. Згідно з посібниками Rails , pluckбезпосередньо перетворює результат бази даних у arrayбез, будуючи ActiveRecordоб'єкти. Це означає кращу ефективність для великого або часто запущеного запиту.

На додаток до відповіді @ apneadiving, pluckможна взяти за аргумент як імена одного, так і кількох стовпців:

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

3

Основна і основна відмінність полягає в тому, що Pluck застосовується на рівні db і збирає, отримує всі дані, а потім повертає запис вам, коли вам потрібно використовувати всі записи, збирайте і коли кілька полів потім використовують pluck


2

Якщо є випадок, коли ви використовуєте кілька атрибутів отриманого запису. У таких випадках слід використовувати pluck.

User.collect(&:email)

У наведеному вище прикладі, якщо вам потрібен лише атрибут електронної пошти, ніж ви витрачаєте пам’ять та час. Оскільки він отримає всі стовпці з таблиці користувачів у базі даних, виділяє пам'ять для кожного атрибуту (включаючи атрибути, які ви ніколи не будете використовувати)

ПРИМІТКА: pluckне повертає ActiveRecord_Relation користувача

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.