2010-04-01 7 views
3

레일즈 애플리케이션에서 일부 비 - 레일 - 모델 테이블을 통합하려고합니다. 모두 매우 좋게 동작, 내가 모델을 설정하는 방법은 다음과 같습니다Rails 애플리케이션 내에서 외부 변경 사항에 대한 데이터베이스 테이블을 모니터링하십시오.

class Change < ActiveRecord::Base 
    establish_connection(ActiveRecord::Base.configurations["otherdb_#{RAILS_ENV}"]) 
    set_table_name "change" 
end 

이 방법은 내가 지금 몇 가지를 실행하고 싶습니다 등 find

기존의 모든 기록을 위해 Change 모델을 사용할 수 있습니다 레코드가 테이블에 추가 될 때 일종의 알림. 모델은 Change.newChange.save을 통해 생성되지 않으므로 ActiveRecord::Observer을 사용하는 것은 옵션이 아닙니다.

새 레코드가 추가 될 때마다 실행되도록 Rails 코드를 얻을 수있는 방법이 있습니까? 나는 delayed_job을 보았지만 그걸 어떻게 설정해야하는지에 관해서는 내 머리를 터뜨릴 수 없었다. 나는 작업이 마지막으로 실행 된 이후에 생성 된 모든 행을 선택하고 각 행에 대해 각각의 Rails 코드를 호출하는 cron-job을 중심으로 전개되는 것을 상상합니다.

업데이트 현재 Javan의 Whenever을 보면 'cron part에서 레일 코드 실행'문제를 해결할 수있는 것 같습니다.

답변

1

-jon 이것은 내가 마지막으로 한 것입니다. 누락 된 평화는 기본적으로 5 분마다 실행되는 평화였습니다. recentchanges은 tmp 파일에서 마지막으로 보았던 ID를 읽고, 더 높은 ID를 가진 새로운 모든 Change 레코드를 가져오고 각 레코드에 대한 일반 관찰자 코드를 실행하고 가장 높은 보지 ID를 tmp 파일에 저장합니다 , 당연하지).

1

그래, 일종의 백그라운드 작업 프로세서 (Delayed :: Job이 인기있는 것 중 하나이거나 데몬 라이브러리 등으로 자신을 가짜로 만들 수 있음)를 실행하거나 실행되는 cronjob을 설정해야합니다 어떤 종류의 일정. 자주 (매일 1 분마다) 확인하고 싶다면 Delayed :: Job 경로를 권하고 싶습니다. 길면 (매시간마다) cron 작업이 잘될 것입니다.

DJ 경로를 따라 가면 새 레코드를 확인한 후 작업을 처리 한 다음 처리 한 다음 각 작업이 완료되면 "완료 됨"으로 표시되므로 작업을 다시 큐업해야합니다. 이 카피 스트라 노에 잘 통합되어 있기 때문에, 사용 Whenever 방법 크론 내에서 레일 코드를 실행하는 나에게 보여 주었다 :

1

상태 변경을 모니터링하는 것과 같이 폴링과 알림의 두 가지 방법이 있습니다. 당신은 지금 폴링 방식을 선택했다. (변경된 경우 cron 작업을 정기적으로 데이터베이스 상태를보고 일부 코드를 실행 함) 레일 스케쥴러 중 하나를 사용하여 동일한 작업을 수행 할 수있다. 거기에 몇 가지가 있습니다 (구글은 쉽게 찾을 수 있습니다, 그들은 다양한 기능 세트를 가지고, 나는 당신이 그 길을 가지고 있다면 당신의 필요에 맞는 하나를 선택하게 할 것입니다)

또한 통지 방법을 시도해 볼 수 있습니다 데이터베이스에 따라 다릅니다. 일부 데이터베이스는 트리거와 외부 프로세스 실행 또는 특정 알림 프로토콜을 모두 지원합니다. 이 경우 데이터베이스 자체에서 테이블 변경 사실을 알게됩니다. 다양한 DBMS를위한 많은 옵션이 있습니다 Getting events from a database

관련 문제