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:
pluckberada 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 idterima kasih untuk metode berdasarkan Enumerable.
Begitu:
jika Anda hanya membutuhkan iddengan 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 selectdancollect
pluckbanyak bidang, Rails 3 tidak, kecuali Anda menggunakan solusi Ryan Lefevre
id, gunakan .idsdokumen Ref: api.rubyonrails.org/classes/ActiveRecord/…
Iya. Menurut panduan Rails , plucklangsung mengubah hasil database menjadi array, tanpa membuat ActiveRecordobjek. Ini berarti kinerja yang lebih baik untuk kueri besar atau yang sering berjalan.
Selain jawaban @ apneadiving, pluckdapat 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: plucktidak mengembalikan ActiveRecord_Relation pengguna
pluckdengan beberapa atribut, sepertipluck(:id, :name)?