2016-04-08 26 views
0

İki dizim var. İlk DB @groups = Group.where(blabla) nesnesinin dizisidir. İkinci API isteği response = [false, false, something] gelir. İkisiyle de geçmesi çalıştığınızda:"zip" kullanımının beklenmeyen sonucu

@groups.zip(response).each do |group, r| 
. 
. 
end 

@groups dizi ikinci eleman başlar ve son yineleme ilk koyar. Neden oluyor? yi = @groups.pluck(:id) ile Dizinin sırasının uygun olduğunu görebiliyorum!

Ben result = [[403, false], [404, false], [405, something]] bekliyoruz ama result = [[404, false], [405, false], [403, something]]

cevap

1

AFAIU var daha net olmak gerekirse, sorun Ruby ile ilgisi yoktur, bu DB motoru konudur. Group.where(blabla) temel olarak SELECT * FROM groups WHERE blabla olarak yürütülür. Bu sorgunun order açık bir şekilde belirtilmediği sürece, sonuç kümesi siparişi garanti kapsamında değildir.

pluck, biraz farklı sorguya dönüştürülür ve DB altyapısı, sonuç kümesini farklı sırada döndürebilir.

Sonuçları belirli bir sırayla almak için sorgunuzda açık ordering'u kullanın.

+0

Ama seçim sırasında pluck kullanıyorum! Bu pluck'in bir şeyi yeniden sıraladığını sanmıyorum. – nobilik

+0

Cevabımı dikkatlice okuyabiliyor musunuz? ['pluck'] (http://apidock.com/rails/ActiveRecord/Calculations/pluck) _another SQL sorgusunu üretir. “Seçim üzerinde pluck kullanın” anlamsız, 'pluck' Rails tarafından kullanıldığından _before_ SQL sorgusu bile DB motoruna gönderiliyor. Farklı sorgular sonuçları farklı sırayla döndürebilir. Bu kadar. ** Hiç kimse, SQL sorgusunda ** açık 'ORDER BY' deyimi belirtilmemişse, döndürülen kayıt kümesinin sırasının tanımlanacağını garanti etmez. – mudasobwa

+0

Eminim haklısınız ve bu sefer benim için daha anlaşılabilir. Teşekkürler – nobilik