2013-03-20 49 views
0

我有這些陣列:高效地處理數組和哈希?

@users = [[1,'Mark'],[2,'Bill'],[3,'John']] 
@projects = [[1,'Change the world'],[2,'Build a computer'],[3,'Run in a circle']] 
@points_due = [[1,1,"40"],[1,3,"80"],[2,1,"20"]] 

我有幾個解決方案,但我正在尋找遍歷所有這些項目,就好像結果通過ActiveRecord的給我的最大性能有效的方式。

我想用項目和<LI>來顯示一個<UL>,其中包含用戶名和該特定用戶的分數。我想出了一些使用injectmap將陣列轉換爲散列的解決方案,但是,我覺得有更好的方法來做這樣的事情。

我想這樣做:

@projects.each do |project| 
    <%= project.name %> 
    <ul> 
    project.each do |user| 
    <li><%= user.name %> | <%= user.points_due %></li> 
    end 
    </ul> 
end 
+0

難道你不能用這些實體之間的ActiveRecord關係來管理它嗎? http://guides.rubyonrails.org/association_basics.html – fmendez 2013-03-20 20:56:24

+0

這只是純粹的紅寶石,沒有導軌的寶石。在我只是試圖傳達我希望看到的結果的例子中,我不應該使用ERB。沒有ActiveRecord,我只有這3個數組。謝謝! – user2192616 2013-03-20 21:19:11

回答

3

做事情像你在談論(迭代模型X,然後顯示的東西每個模型Y),嵌套循環.each(更或者更少像你的問題那樣)是一個非常標準的方法。如果顯示開始變得複雜,則可以將其提取到一個或多個部分的層中。

擔心此方法或其他方法的性能可能過早。操作數據結構的不同方式的性能不會成爲頁面整體性能的重要因素。一旦你有一些工作,看看它是否真的很慢,然後擔心如何使其更快。

根據您的意見編輯:對於此數據,哈希陣列(帶鍵符號)可能會比陣列陣列更好。並不是因爲它們更高效,而是因爲它會讓你的代碼更易於理解(對於你自己而言,即使沒有其他人可以使用它)。

考慮: 使用AR對象,你會做以下打印每個項目的名稱:

@projects.each do |project| 
    puts project[:name] 
end 

而使用數組:如果您使用哈希模擬這種行爲

@projects.each do |project| 
    puts project.name 
end 

@projects.each do |project| 
    puts project[1] 
end 

難記,你必須做確保你的代碼以正確的順序放置屬性,或者可能是項目的其他方面,而不是名稱。

假設你已經同意我的觀點,並且正在使用這個結構(@projects = [{:title => 'foo', 'id' => 1}, {:title => 'bar', :id => 2}]等),這裏有一種方法來執行你提到的迭代,只需打印出(我相信是的)所需的數據 - 點的數量在@points_due對於有一些在該項目中每個用戶列出:

@projects.each do |project| 
    puts project[:name] 
    @points_due.select{|pd| pd[:project_id] == project[:id] }.each do |project_points| 
    user = @users.select{|u| u[:id] == project_points[:user_id]}.first 
    puts "#{user[:name]} has #{project_points[:points]} points due on this project." 
    end 
end 

我希望這接近你想要的輸出,但如果不是,它應該是相當容易使用它作爲一個例子 - 明智地使用.select會可能會完成。

編輯第二:轉換數組到哈希:

@projects_as_arrays = [[1,'Change the world'],[2,'Build a computer'],[3,'Run in a circle']] 
@projects_as_hashes = @projects_as_array.map do |p_arr| 
    {:id => p_arr[0], :name => p_arr[1]} 
end 

你應該能夠做到沿着這些線路一般爲每個數組的東西。

+1

+1「'擔心這種方法或其他方法的性能可能不成熟」 – 2013-03-20 21:00:39

+0

嗨,感謝您的快速響應,也許我需要重新提出問題。我並不擔心視圖層,甚至可以使用遞歸部分。然而,困擾我虛弱頭腦的問題是,找到一種方法將這些數組變成可能是散列,如嵌套資源。如果願意的話,考慮將points_due作爲連接表,根據它們的id找到數組內的關係。類似hash的東西會不會提供類似於db schema中索引的更好結果? – user2192616 2013-03-20 21:08:28

+0

另外請記住,只是迭代的項目數組與給出的例子不會給我想要的結果。 @points_due數組是項目和用戶之間的鏈接。 – user2192616 2013-03-20 21:11:09