2013-03-27 4 views
1

DelayedJob으로 지오 코드 api 호출의 흐름을 제한 할 수있는 방식으로 내 Rails 앱에서 지오 코딩을 처리하려고합니다.DelayedJob의 스로틀 지오 코드 요청 run_at

내 의도는 지오 코딩 요청이 사용자에게 시간에 민감하지 않기 때문입니다. 또한 무료 지오 코딩 API (Nominatim)를 사용하여 초당 요청 수를 더 이상 요구하지 않습니다.

나는 지오 코드 보석 설정을 가지고 있는데, 내 사용자 모델에서 사용자 계정 설정에서 우편 번호를 얻습니다 (비워 둘 수 없으며 이미 유효성을 검사하고 있습니다).

제 아이디어는 run_at를 사용하여 호출을 제한하는 것이었지만 run_at의 초기 테스트는 대기중인 작업을 표시하지만 지오 코드는 완료시 값을 저장하지 않습니다.

after_validation :run_geocode, :if => :postcode_changed? 

def run_geocode 
    self.delay(:run_at => 30.seconds.from_now).geocode 
end 

나는 여기 꽤 분명한 것을 놓쳤습니까? 나는 단지 : 지오 코드 (geocode) 메소드가 문서에서 말하는 것을 사용하는 것만으로는 운동 할 수 없다.

답변

1

아무 곳이나 저장을 호출하지 않으면 지오 코딩 된 응답이 저장되지 않을 수 있습니다. 또한 유효성 검사 후에 레코드를 저장/업데이트/삭제 한 후에 콜백을 실행하는 것이 일반적입니다.

after_save :run_geocode, :if => :postcode_changed? 

def run_geocode 
    self.delay.geocode! # delayed_job will process geocode! at a later point in time 
end 

def geocode! 
    # do whatever is nescessary to receive geocoded infos 
    # assign the results 
    # save the record to save the updates 
    self.save 
end 
+0

감사합니다. 토마스 덕분에, 지오 코드 응답이 올 때까지 기다리지 않습니까? 그것이 메모리 문제를 일으킬 수 있습니까? 또는 지오 코드가 포함 된 지연된 메서드를 만들어 저장해야합니까? – Les

+0

아주 좋은 점, 나는 그것을 놓쳤다. 내 대답을 업데이트했습니다. –

+0

환호하는 Thomas, 매력처럼 일했다 :) – Les