2011-12-11 38 views
0

我想知道什麼是建立一個自定義哈希方面選擇一個合適的關鍵方面的最佳途徑。可用的選項有:在RoR中構建散列:使用對象引用還是ID作爲鍵?

my_hash = {} 
for user in User.all do 
    my_hash[user] = some_value # option 1 using object reference 
    my_hash[user.id] = some_value # option 2 using object id 
end 

我認爲選擇2應該去,因爲它消耗更少的內存,並且可能會更快的方式。但是,它也有一個缺點:

選項1,可以讓我的哈希傳遞給視圖,只是做

<% @my_hash.collect do |user, value| %> 
    <p><%= user.name %> | <%= value %></p> 
<% end %> 

,而選項2,需要一些方法來從ID獲取用戶的關鍵。

任何建議如何處理這是非常感謝。 如果您贊成選項2,請指出如何最好地訪問由散列鍵中的id引用的對象。謝謝!

回答

3

真正的問題是「你打算如何使用這個散列」。如果您需要迭代並顯示有關用戶的一些信息,則第一種方法更好;如果您需要訪問與用戶ID相對應的值,則選項2會更好。你甚至可以考慮另一種解決方案

my_hash = {} 

User.all.each do |u| 
    my_hash[u.id] = [u, some_value] 
end 

我的觀點是:沒有正確的答案,這真的取決於你打算讓這個哈希的使用。

+0

謝謝你指出第三個選項,@thoferon。實際上,我現在正在根據個案的情況做它,但是想重構我的代碼以堅持兩種選擇之一。原因是我最終總是想知道密鑰是ID還是obj。參考。我喜歡你的解決方案,因爲它可以同時處理散列中的所有數據和非常容易地檢索單個條目。如果沒有更好的解決方案出現,在一段時間後會接受答案。謝謝 – emrass

1

選項1不應該是任何較慢的b/c對象引用與所需的內存存儲方面實際上並不不同。

您可以進行自己的測試,例如分配100000或1000000個值來散列,一次使用整數,另一次使用對象。

我相信你會有不同的結果,這取決於你的操作系統,x86或x64和ruby版本。

+0

感謝您的回覆!還沒有做過任何性能基準測試,所以我需要先熟悉它們。不過,我發現一個問題與選項一:當我想要獲得一個特定的條目,例如@my_hash [User.first],然後1)我有內存中的用戶兩次; 2)ruby/rails會比較對象的主鍵以在哈希中找到正確的條目。那麼選項1仍然是推薦的解決方案? – emrass

0

ActiveRecord將ActiveRecord::Base#hash定義爲id.hash,所以使用useruser.id作爲散列鍵是完全沒有區別的。話雖如此,選項1在你的特定情況下顯然更好。