2012-04-09 21 views
71

Więc wykonać zapytanie do DB i mam kompletną tablicę obiektów:Szyny filtrowania tablicę obiektów przez wartość atrybutu

@attachments = Job.find(1).attachments 

Teraz mam tablicę obiektów nie chcą wykonywać kolejna kwerenda db, ale chciałbym, aby filtrować tablicę opartą na Attachment obiektu file_type tak, że mogę mieć listę attachments gdzie typ pliku jest 'logo' a następnie kolejna lista attachments gdzie typ pliku jest 'image'

Coś tak:

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

Ale w pamięci zamiast w zapytaniu db.

Pozdrawiam

Odpowiedz

135

Spróbuj:

To jest w porządku:

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

ale dla wydajności mądry nie trzeba iteracyjne @attachments dwukrotnie:

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

Rozwiązanie As @ Vik jest prawie idealne, po prostu dodam to w binarnych przypadkach, możesz użyć funkcji "partycji", aby wszystko było słodkie. http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-partition – Vlad

+0

Dzięki @Vlad, to fajne, ale obsługuje tylko wtedy, gdy musimy zebrać tylko dwie rzeczy z obiektu. – Vik

+0

Tak, właśnie dlatego powiedziałem "binarny" :). W pytaniu pojawił się wybór logo lub obrazu, więc dodałem to dla kompletności. – Vlad

2

Czy próbowałeś/aś załadunku?

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

Niestety ja nie jest jasne: jak filtrować według wartości atrybutu obiektu bez przechodzenia przez tablicę? – joepour

+0

Jeśli dobrze zrozumiałem, chcesz mniej zapytań db, szczególnie, gdy zapytanie takie jak '@attachments = Job.first.attachments' zostało wykonane, chcesz zapętlić' @ attachments', podczas gdy nie chcesz więcej zapytań db . czy to właśnie chcesz robić? –

+0

Wykonuję zapytanie db i otrzymuję tablicę obiektów. Następnie chcę utworzyć dwie osobne listy z tej jednej tablicy, filtrując obiekty w oparciu o wartość ich atrybutów (Zobacz oryginalny post) - okrzyki – joepour

3

Jeżeli załączniki są

@attachments = Job.find(1).attachments 

To będzie tablica przyłączenia obiektów

użyciu Wybierz metodę filtrowania na podstawie FILE_TYPE.

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

Nie spowoduje to uruchomienia żadnego zapytania db.

Powiązane problemy