Nesne dizisini öznitelik değerine göre filtreleyen raylar


98

Bu yüzden, db için bir sorgu gerçekleştiriyorum ve eksiksiz bir nesne dizisine sahibim:

@attachments = Job.find(1).attachments

Şimdi ben başka db sorgusu yapmak istemiyorum nesneler dizisi var, ama esas dizi filtre istiyorum Attachmentnesnenin var file_typeben bir listesi var, böylece attachmentsdosya türü olduğu 'logo've daha sonra bir başka liste attachmentsdosya türü'image'

Bunun gibi bir şey:

@logos  = @attachments.where("file_type = ?", 'logo')
@images = @attachments.where("file_type = ?", 'image')

Ancak db sorgusu yerine bellekte.


İyi bir kullanım örneği gibi görünüyor partition- örnek burada .
— SRack

Yanıtlar:


174

Deneyin :

Bu iyi :

@logos = @attachments.select { |attachment| attachment.file_type == 'logo' }
@images = @attachments.select { |attachment| attachment.file_type == 'image' }

ancak performans açısından @ ekleri iki kez yinelemeniz gerekmez:

@logos , @images = [], []
@attachments.each do |attachment|
  @logos << attachment if attachment.file_type == 'logo'
  @images << attachment if attachment.file_type == 'image'
end

2
@ Vik'in çözümü oldukça ideal olduğu için, bunu ikili durumlarda ekleyeceğim, işleri tatlı hale getirmek için bir 'bölümleme' işlevi kullanabilirsiniz. ruby-doc.org/core-1.9.3/Enumerable.html#method-i-partition
— Vlad

Teşekkürler @Vlad, bu harika, ancak yalnızca nesneden yalnızca iki şey toplamamız gerektiğinde destekliyor.
— Vik

1
Evet, bu yüzden "ikili" dedim :). Soruda, görünüşe göre bir logo veya resim seçimi vardı, bu yüzden bunu bütünlük için ekledim.
— Vlad

8

Ekleriniz

@attachments = Job.find(1).attachments

Bu, ek nesneleri dizisi olacaktır

File_type'a göre filtrelemek için seçme yöntemini kullanın.

@logos = @attachments.select { |attachment| attachment.file_type == 'logo' }
@images = @attachments.select { |attachment| attachment.file_type == 'image' }

Bu, herhangi bir db sorgusunu tetiklemeyecektir.


2

istekli yüklemeyi denedin mi?

@attachments = Job.includes(:attachments).find(1).attachments

Maalesef net değilim: dizi boyunca döngü yapmadan bir nesne özniteliğinin değerine göre nasıl filtre uygulayabilirim?
— joepour

Doğru anladıysam, daha az db sorgusu istersiniz, özellikle bir kez @attachments = Job.first.attachmentsçalıştırıldığında gibi bir sorgu , @attachmentsbu arada daha fazla db sorgusu istemediğinizde döngü yapmak istersiniz. yapmak istediğin bu mu?
— Siwei Shen 申思维

Bir db sorgusu yapıyorum ve bir dizi nesne alıyorum. Daha sonra, nesneleri özniteliklerinin değerine göre filtreleyerek bu diziden iki ayrı liste oluşturmak istiyorum (Orijinal
— gönderiye

0

Nereyi kullanarak filtreleyebilirsiniz

Job.includes(:attachments).where(file_type: ["logo", "image"])

0

Bunu biraz daha farklı yapardım. Sorgunuzu yalnızca ihtiyacınız olanı alacak ve buradan ayıracak şekilde yapılandırın.

Bu yüzden sorgunuzu şu şekilde yapın:

#                                vv or Job.find(1) vv
attachments = Attachment.where(job_id: @job.id, file_type: ["logo", "image"])
# or 
Job.includes(:attachments).where(id: your_job_id, attachments: { file_type: ["logo", "image"] })

Ve sonra verileri bölümlere ayırın:

@logos, @images = attachments.partition { |attachment| attachment.file_type == "logo" }

Bu, peşinde olduğunuz verileri düzgün ve verimli bir şekilde alacaktır.

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.