Berikut dua contoh kode.
Yang pertama dengan collect
:
User.first.gifts.collect(&:id)
Yang kedua dengan pluck
:
User.first.gifts.pluck(:id)
Apakah ada perbedaan di antara mereka dalam performa atau hal lain?
Berikut dua contoh kode.
Yang pertama dengan collect
:
User.first.gifts.collect(&:id)
Yang kedua dengan pluck
:
User.first.gifts.pluck(:id)
Apakah ada perbedaan di antara mereka dalam performa atau hal lain?
Jawaban:
pluck
berada di level db. Ini hanya akan menanyakan bidang tertentu. Lihat ini .
Saat kamu melakukan:
User.first.gifts.collect(&:id)
Anda memiliki objek dengan semua bidang dimuat dan Anda cukup mendapatkan id
terima kasih untuk metode berdasarkan Enumerable.
Begitu:
jika Anda hanya membutuhkan id
dengan Rails 4, gunakan ids
:User.first.gifts.ids
jika Anda hanya membutuhkan beberapa bidang dengan Rails 4, gunakan pluck
:User.first.gifts.pluck(:id, :name, ...)
jika Anda hanya membutuhkan satu bidang dengan Rails 3, gunakan pluck
:User.first.gifts.pluck(:id)
jika Anda membutuhkan semua bidang, gunakancollect
jika Anda membutuhkan beberapa bidang dengan Rails 4, tetap gunakan pluck
jika Anda membutuhkan beberapa bidang dengan Rails 3, gunakan select
dancollect
pluck
banyak bidang, Rails 3 tidak, kecuali Anda menggunakan solusi Ryan Lefevre
id
, gunakan .ids
dokumen Ref: api.rubyonrails.org/classes/ActiveRecord/…
Iya. Menurut panduan Rails , pluck
langsung mengubah hasil database menjadi array
, tanpa membuat ActiveRecord
objek. Ini berarti kinerja yang lebih baik untuk kueri besar atau yang sering berjalan.
Selain jawaban @ apneadiving, pluck
dapat menggunakan nama kolom tunggal dan ganda sebagai argumen:
Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
Jika ada kasus di mana Anda menggunakan beberapa atribut dari rekaman yang diambil. Dalam kasus seperti itu, Anda harus menggunakan pluck
.
User.collect(&:email)
Dalam contoh di atas jika Anda hanya membutuhkan atribut email daripada Anda membuang-buang memori dan waktu. Karena itu akan mengambil semua kolom dari tabel pengguna dalam database, mengalokasikan memori untuk setiap atribut (termasuk atribut yang tidak akan pernah Anda gunakan)
CATATAN: pluck
tidak mengembalikan ActiveRecord_Relation pengguna
pluck
dengan beberapa atribut, sepertipluck(:id, :name)
?