İşte iki örnek kod.
Birincisi collect
:
User.first.gifts.collect(&:id)
İkincisi pluck
:
User.first.gifts.pluck(:id)
Performans açısından veya başka bir şey arasında herhangi bir fark var mı?
İşte iki örnek kod.
Birincisi collect
:
User.first.gifts.collect(&:id)
İkincisi pluck
:
User.first.gifts.pluck(:id)
Performans açısından veya başka bir şey arasında herhangi bir fark var mı?
Yanıtlar:
pluck
db düzeyindedir. Yalnızca belirli bir alanı sorgulayacaktır. Bunu gör .
Ne zaman yaparsan:
User.first.gifts.collect(&:id)
Tüm alanların yüklü olduğu nesneleriniz var ve id
Numaralandırılabilir'e dayalı yöntem sayesinde basitçe teşekkür edersiniz .
Yani:
Yalnızcaid
Rails 4 ile ihtiyacınız varsa , şunu kullanın ids
:User.first.gifts.ids
Rails 4 ile yalnızca bazı alanlara ihtiyacınız varsa , şunu kullanın pluck
:User.first.gifts.pluck(:id, :name, ...)
Rails 3 ile yalnızca bir alana ihtiyacınız varsa , şunu kullanın pluck
:User.first.gifts.pluck(:id)
tüm alanlara ihtiyacınız varsa kullanıncollect
Rails 4 ile bazı alanlara ihtiyacınız varsa, yine de kullanın pluck
Rails 3 ile bazı alanlara ihtiyacınız varsa, select
vecollect
pluck
birden fazla alanı destekliyor , Ryan
id
, kullanım .ids
Ref doc: api.rubyonrails.org/classes/ActiveRecord/...
Evet. Raylar kılavuzları göre , pluck
doğrudan bir veritabanı sonucu dönüştürür array
inşa etmeden, ActiveRecord
nesneleri. Bu, büyük veya sıklıkla çalışan bir sorgu için daha iyi performans anlamına gelir.
@ Apneadiving'in cevabına ek olarak, pluck
hem tekli hem de çoklu sütun adlarını bağımsız değişken olarak alabilir:
Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
Alınan kaydın birkaç özelliğini kullandığınız bir durum varsa. Bu gibi durumlarda kullanmalısınız pluck
.
User.collect(&:email)
Yukarıdaki örnekte, yalnızca e-posta özelliğine ihtiyacınız varsa, bellek ve zaman harcadığınızdan daha fazla. Veritabanındaki kullanıcı tablosundaki tüm sütunları alacağından, her öznitelik için bellek ayırır (asla kullanmayacağınız öznitelikler dahil)
NOT: pluck
kullanıcının ActiveRecord_Relation değerini döndürmez
pluck
birden çok özellik ile kullanamazpluck(:id, :name)
mısınız?