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?
sumber
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?
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
dengan beberapa atribut, sepertipluck(:id, :name)
?pluck
banyak bidang, Rails 3 tidak, kecuali Anda menggunakan solusi Ryan Lefevreid
, gunakan.ids
dokumen Ref: api.rubyonrails.org/classes/ActiveRecord/…Iya. Menurut panduan Rails ,
pluck
langsung mengubah hasil database menjadiarray
, tanpa membuatActiveRecord
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:sumber
Perbedaan dasar dan utama adalah bahwa Memetik berlaku pada tingkat db dan mengumpulkan semua data dan kemudian mengembalikan catatan kepada Anda ketika Anda membutuhkan semua catatan menggunakan mengumpulkan dan ketika beberapa bidang kemudian menggunakan memetik
sumber
Jika ada kasus di mana Anda menggunakan beberapa atribut dari rekaman yang diambil. Dalam kasus seperti itu, Anda harus menggunakan
pluck
.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 penggunasumber