Rails'de topla ve topla arasındaki fark nedir?


123

İş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:


230

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


"Bazı alanlara ihtiyacınız varsa, seç ve topla'yı kullanın" - pluckbirden çok özellik ile kullanamaz pluck(:id, :name)mısınız?
Alexander

@AlexPopov - Rails 4+ pluckbirden fazla alanı destekliyor , Ryan
Lefevre'nin

3
Raylar 4 olarak, eğer sadece ihtiyaç id, kullanım .idsRef doc: api.rubyonrails.org/classes/ActiveRecord/...
Ivan Chau

30

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']]

3

Temel ve temel fark, Pluck'in db düzeyinde uygulanması ve tüm verileri toplaması ve ardından tüm kayıtlara ihtiyaç duyduğunuzda kaydı size geri göndermesi ve birkaç alanda toplama kullanmasıdır.


2

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.