2012-07-12 96 views
1

我有一個返回超過50k記錄的查詢結果。我這樣做:從Rails數組中收集獨特的活動記錄對象?

@array.collect {|x| x.field_name1}.uniq, @array.collect {|x| x.field_name2}.uniq 

..在視圖中爲幾個選擇創建過濾器。 需要相當長的一段時間。有什麼方法可以在一個循環中收集所有獨特的元素以提高性能? 感謝

+0

這是一個很好的問題,但.. – Trip 2012-07-12 12:21:44

回答

4

喜歡的東西

unique_field_1_values = Set.new 
unique_field_2_values = Set.new 
@array.each do |x| 
    unique_field_1_values << x 
    unique_field_2_values << x 
end 

只能通過遍歷數組一次,併爲您提供了兩套與該領域的獨特價值。雖然不知道它是否更快。

+6

我認爲這將更快得到獨特的元素直接在SQL查詢中,而不是在Ruby中。 – tokland 2012-07-12 12:28:57

+0

很可能,特別是取決於索引,但我認爲你需要每個屬性的一個查詢。 – 2012-07-12 12:36:38

+0

感謝您的快速響應。我根本沒有想過套。這符合我的需求。我不能使用不同的SQL查詢,因爲我需要稍後使用結果。我認爲最好只查詢一次數據庫,然後處理結果。 – Dennis 2012-07-12 13:17:17

10

選擇獨特的列值的純Ruby/Rails的方法(沒有硬編碼SQL)是:

uniq_fields1 = Model.uniq.pluck(:field_1) 
# issues: SELECT DISTINCT field_1 FROM "models" 
0

伴隨@ tokland的評論的線路:

[:field1, :field2].map { |f| YourTable.select(f).uniq } 

由於@Frederick指出,是事實上有兩個命中數據庫,但會(可能)更快,如果你有這些領域的索引,幾乎肯定會更快。

+0

你會得到關係,而不是價值(根據作者的代碼,這是需要的)。 – jdoe 2012-07-12 13:04:16

+0

確實。交叉郵件再次讓我。你有我'拔'。你讓我'拔'。 – 2012-07-12 13:45:45

0

如果我沒有誤解的問題,uniq應該給你獨一無二的對象,以及:

array_of_objects.uniq 

Documentation