2012-09-12 2 views
0

내 회사에서 사용하는 다른 응용 프로그램에 속한 Rails 3.2 응용 프로그램과 완전히 별개의 타사 데이터베이스를 쿼리해야합니다.Rails 3.2 응용 프로그램에서 원격 데이터베이스 쿼리

궁극적으로, 필자는 Rails 애플리케이션이 처리 할 "다른"데이터베이스에서 새로운 행을로드하도록 cron을 설정하게됩니다.

otherdb에 대한 액세스 권한이 있으며 여기에서 어디로 가야할지 궁금합니다. config/database.yml에 새 항목을 만드시겠습니까? 그렇다면 쿼리를 otherdb (내 기본 레일 development 또는 production db 대신)으로 지정할시기를 어떻게 지정합니까?

답변

1

이 요구 사항을 구현하는 데는 몇 가지 방법이 있으며 가장 쉬운 방법은 config/database.yml 및 사용자 정의 네임 스페이스 모델을 사용하는 것입니다.

아래와 비슷한 이름을 지정하면 Rails.env이라는 접미사를 사용하여 이름 지정 규칙을 따르면 약술 한 기능을 제공합니다.

먼저 기존 환경의 외부 데이터베이스에 대한 새 항목을 만듭니다. 그것은 당신이 기능을 테스트 할 수 있도록 도와 줄 것입니다.

# database.yml 
development: 
    # add configuration as required 

otherdb_development: 
    # add configuration as required 

둘째, 당신은 otherdb 데이터베이스에 액세스하는 데 필요한 특정 테이블의 각 모델을 추가 할 수 있습니다. 나는 혼란과 잠재적 인 건드리지 방지하기 위해이 모델에 대한 네임 스페이스 디렉토리 (아래 예 otherdb)를 추가하는 것이 좋습니다 것 : Otherdb::Foo

# /app/models/otherdb 
class Otherdb::Foo < ActiveRecord::Base 
    establish_connection "otherdb_#{Rails.env}" 
    set_table_name "foo" # customize this if the table name will be different from the classname and is required 
end 

그런 다음 (예를 들어)를 사용할 수 있습니다 방법과 같은 결과 데이터를 사용 필수.

+0

감사합니다. 시도해 보겠습니다. 관련 메모 : 내 개발, 테스트 및 프로덕션 데이터베이스는 모두 PostgreSQL이므로 'pg'보석을 실행하고 있습니다. 원격 MySQL 데이터베이스를 처리하기 위해 MySQL 관련 보석을 설치해야합니까? 이것들은 함께 "좋게"연주 할 수 있습니까? 아니면 약간의 갈등을 기대할 수 있습니까? – jasonmklug

+0

맞습니다. 원격 데이터베이스가 다른 제품 인 경우 다른 어댑터를 사용해야합니다. – Sasha

1

나는 어제 같은 문제가있었습니다. Rails 3.2를 사용하기 때문에 외부 데이터베이스에 연결하는 모든 모델은 연결을 설정하는 단일 추상 클래스의 서브 클래스 여야합니다. 이전 버전의 Rails에서는 @ Sasha의 대답이 효과가있었습니다. 그러나 3.2에서, 그 대답은 다양한 혼란스러운 데이터베이스 오류를 가져올 것입니다. (어떤 오류가 당신이 얻을 것은 당신이 무엇을 사용 DB에 따라 달라집니다.) 레일 3.2에서

, 이것은 작동합니다 내가 찾은 유일한 방법입니다 :

  1. 가 필요로하는 모든 모델에 공통 기본 클래스를 확인 기본 데이터베이스가 아닌 으로 문의하십시오.
  2. self.abstract_class = true을 호출하여이 기본 클래스가 추상임을 ActiveRecord에 알립니다.
  3. 기본 클래스에서 establish_connection으로 전화하십시오.

    # database.yml: 
    development: 
        # default configuration goes here 
    
    other_development: 
        # external db configuration goes here 
    
    class OtherTable < ActiveRecord::Base 
        self.abstract_class = true 
        establish_connection "other_#{Rails.env}" 
    end 
    
    class Student < OtherTable 
    end 
    
    class Course < OtherTable 
    end 
    

    당신은 자세한 내용을 좋아하는 나는 Establishing a Connection to a Non-Default Database in Rails 3.2 제목 쓴 블로그 게시물을 참조하세요 : 여기

는 외부 테이블에서 학생들과 코스 예입니다.

관련 문제