2015-01-23 3 views
2

Mongoid 데이터베이스가있는 레일 4 애플리케이션이 있으며 테스트 용도로 샌드 박스 환경을 도입하려고합니다. 프로덕션 db에서 샌드 박스로 복사하려는 일부 데이터 (두 모델)가 있습니다.데이터베이스 간 레이크 작업

나는 cronjob이 호출하는 레이크 작업으로이 작업을 수행합니다. 그러나이 레이크 작업에서는 데이터베이스에 두 개의 연결을 설정하는 방법과 다른 데이터베이스에 대해 동일한 모델을 사용하는 방법을 잘 모릅니다.

나는 mongodb 레이어 (여기서는 How to copy a collection from one database to another in MongoDB처럼)에서 생각하고 있었지만 한 모델은 샌드 박스 데이터베이스에만 부분적으로 복사해야하는 데이터로 구성되어 있습니다. 따라서 Rails 환경에서해야한다고 생각합니다.

namespace :sandbox do 
    desc "Syncs production -> sandbox data" 
    task(:sync => :environment) do |t, args| 
     Article.all.each do |article| 
     if my_model1.state == :active 
      # here it should sync article to the sandbox models 

      # and then, it should also sync all the comments to the sandbox models 
      article.comments 
     end 
     end 
    end 
    end 
end 

답변

1

내가 마지막으로 자신의 해결책을 발견 :이 레이크 작업에서는

, 나는 내 모든 기사는,하지만 난 방법을 샌드 박스 데이터베이스로 "푸시"을 모르고 있습니다. 열쇠는 mongoid.yml 안에 정의 할 수있는 몽고 이드 세션입니다. 당신이 샌드 박스에 생산 데이터를 복사 할 경우

, 당신이 당신의 샌드 박스 환경 내부에 두 번째 세션을 정의 할 수 있습니다 (당신은 샌드 박스 ENV에서 작업을 시작하고 당신은 프로덕션 데이터베이스에 액세스 할 수 있습니다) :

sandbox: 
    sessions: 
    default: 
     database: your_sandbox_db 
     hosts: 
     - localhost:27017 
    production_sync: 
     database: your_production_db 
     hosts: 
     - localhost:27017 

당신은 당신이 이런 식으로 동기화 할 모델에 대해 별도의 클래스를 정의하여 production_sync 세션에 액세스 할 수 있습니다

class ArticleProduction 
    include Mongoid::Document 
    include Mongoid::Attributes::Dynamic 
    store_in collection: "articles", session: "production_sync" 
end 

이제 프로덕션 데이터베이스에 액세스하기 위해이 클래스를 사용할 수 있습니다. 그는 매일 cronjob에 의해 호출되는,

production_articles = ArticleProduction.map(&:attributes) 
production_articles.each do |attributes| 
    Article.create(attributes) 
end 

내가 나 자신에게 레이크 작업을 정의하고, 동기화 데이터 생산에서 샌드 박스 : 당신이 샌드 박스에 생산에서 모든 데이터를 복사하려면, 다음과 같이 해.

하나의 질문이 남아 있습니다. 데이터를 변경하지 않으려면 일종의 읽기 전용 모드가 유용 할 것입니다 (여기 Make mongoid session read only 참조).