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.