2012-04-09 118 views
71

過濾對象數組所以我執行查詢的數據庫,我有對象的完整陣列:的Rails根據屬性值

@attachments = Job.find(1).attachments 

現在我已經有了對象,我不想執行的數組另一個數據庫查詢,但我想過濾基礎上,Attachment對象的file_type陣列,這樣我可以有attachments一個列表,文件類型爲'logo',然後的attachments另一個列表,文件類型爲'image'

東西像這樣:

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

但在內存中而不是數據庫查詢。

乾杯

回答

135

嘗試:

這是罰款:

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

但性能明智的,你不需要重複兩次@attachments:

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

由於@ Vik的解決方案非常理想,我只是在二進制情況下添加這些內容,你可以使用'分區'功能讓事情變得更加美好。 http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-partition – Vlad 2016-06-20 21:04:15

+0

感謝@Vlad,這很酷,但它只支持我們只需要從對象收集兩件東西。 – Vik 2016-08-01 07:52:08

+0

是的,這就是爲什麼我說「二元」:)。在這個問題上,顯然有一個標誌或圖像的選擇,所以我加了這個完整性。 – Vlad 2016-08-01 19:04:41

2

你試圖預先加載?

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

對不起,我沒有說清楚:如何按照對象屬性的值進行過濾而不循環數組? – joepour 2012-04-09 07:50:54

+0

如果我理解正確,那麼您希望獲得更少的db查詢,尤其是,一旦執行了諸如「@attachments = Job.first.attachments」之類的查詢,您希望循環「@ attachments」,同時您不希望再有任何數據庫查詢。這是你想要做什麼? – 2012-04-09 08:46:53

+0

我做一個數據庫查詢並接收一個對象數組。然後,我想通過根據屬性的值過濾對象來創建兩個單獨的列表。 - 歡呼聲 – joepour 2012-04-09 08:55:52

3

如果你的附件是

@attachments = Job.find(1).attachments 

此附件的將是數組對象

使用選擇方法基於FILE_TYPE進行過濾。

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

這不會觸發任何數據庫查詢。