İş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:
pluckdb 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 idNumaralandı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, selectvecollect
pluckbirden fazla alanı destekliyor , Ryan
id, kullanım .idsRef doc: api.rubyonrails.org/classes/ActiveRecord/...
Evet. Raylar kılavuzları göre , pluckdoğrudan bir veritabanı sonucu dönüştürür arrayinşa etmeden, ActiveRecordnesneleri. 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, pluckhem 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: pluckkullanıcının ActiveRecord_Relation değerini döndürmez
pluckbirden çok özellik ile kullanamazpluck(:id, :name)mısınız?