2012-06-28 4 views
1

내 연락처 배열 (모델)에 id 값이있는 Contact가 있으면 true를 반환하고 싶습니다. 예를 들어 :ActiveRecord 객체 배열에서 값 찾기 반복되는 DB 호출에서 값 찾기

@contacts = Contact.all 

@someval = "alskjdf" 

find_val(@contacts, @someval) 

def find_val(contacts, val) 
    @contact.each do |c| 
    if c.id == val 
     return true 
    end 
    end 
    return false 
end 

나는 연락처 목록이있는 외부 API에서 일부 데이터를 제외하기 위해, 내 응용 프로그램에서 반복적으로 (이 특정 행동에 대한 최대 약 100 회)이 작업을 수행 할 수 있습니다. 이것은 너무 비싸 질 것인가?

ActiveRecord와 비슷한 빠른 작업을 수행 할 수있을 것이라고 생각했지만 데이터베이스에서 데이터를 가져온 후에 배열에서 찾을 수 있지만 그 것을 알아낼 수는 없습니다. 이것처럼 ActiveRecord를 호출하기에는 너무 비싸지 않습니까?

Contacts.find_by_id(@someval) 

위의 행은 수백 번 호출해야합니다 ... 나는 배열을 통해 iterating 덜 비싼 것 같습니다. 감사!

contacts = Contact.all.inject({}) {|hash, contact| hash[contact.id] = contact; hash } 

그런 다음 당신은 쉽게에서 contact[id]와 연락처를 얻을 수 있습니다 : 당신은 DB에서 모두 검색 한 후

답변

2

가장 좋은 방법은 키와 연락처 ID를 사용하여 인덱스에 해시의 연락처 것 공연 방법.

class Array 
    def haz_value?(someval) 
    if self.first.respond_to? :id 
     self.select { |contact| contact.id == someval }.length > 0 
    else 
     false 
    end 
    end 
end 

그런 다음 @contacts.haz_value? @someval를 호출 할 수 있습니다 : 당신이 배열을 검색하기 위해 작성해야하는 코드의 양을 줄일 수

1

한 가지 방법은 배열 클래스를 열고 사용자 정의 인스턴스 방법을 확인하는 것입니다. 효율성 측면에서 필자는 비교를하지 않았지만 두 가지 방법 모두 Array의 내장 반복기를 사용합니다. 데이터베이스에 저장 프로 시저를 만들고 ActiveRecord (here is how you can do that)를 통해 호출하는 것이 더 빠를 것입니다.