Ось два зразкових коди.
Перший із 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використовуйте .idsRef 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)?