2011-12-11 3 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 옵션 2 키의 ID에서 사용자를 얻기 위해 어떤 방법을 필요로하는 반면

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

.

이 문제를 해결하는 방법에 대한 권장 사항은 크게 알려드립니다. 옵션 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가 아니어야합니다. 객체 참조는 필수 메모리 저장과 관련하여 Integer와 실제로 다르지 않습니다.

예를 들어 해시에 100000 또는 1000000 값을 할당하고 정수로 한 번, 개체로 다른 값을 할당하는 등의 자체 테스트를 수행 할 수 있습니다.

OS, x86 또는 x64 및 루비 버전에 따라 결과가 달라집니다.

+0

답장을 보내 주셔서 감사합니다. 아직 성능 벤치 마크를 수행하지 않았기 때문에 먼저 익숙해 져야합니다. 나는 옵션 1을 가지고 하나의 이슈를 본다 : 내가 특정한 엔트리를 원할 때, 예를 들면. @my_hash [User.first], 1) 메모리에 사용자가 두 번 있습니다. 2) 루비/레일은 객체의 기본 키를 비교하여 해시에서 올바른 항목을 찾습니다. 옵션 1이 여전히 권장 솔루션일까요? – emrass

0

액티브는 id.hashActiveRecord::Base#hash 정의, 그래서 당신은 해시 키로 user 또는 user.id 사용 여부에는 차이가 전혀 없다. 옵션 1이 분명히 당신의 특별한 경우에 더 좋다고 말한 것입니다.

관련 문제