복붙노트

[RUBY-ON-RAILS] 내가 어떻게 활성 레코드 레일에 두 개의 서로 다른 데이터베이스와 함께 작동합니까?

RUBY-ON-RAILS

내가 어떻게 활성 레코드 레일에 두 개의 서로 다른 데이터베이스와 함께 작동합니까?

나는 다른 레일 모델에서 다른 데이터베이스 연결을 사용해야합니다. 그렇게 할 수있는 그리 해키 방법이 있습니까?

모든 링크 또는 키워드를 검색 좋은 것입니다 :)

해결법

  1. ==============================

    1.mikej는 권리입니다. 나는 그러나, 약간의 비트 청소기를 연결을 조사하기 위해 모델 코드를 만드는 보석을 쓰기 않았다.

    mikej는 권리입니다. 나는 그러나, 약간의 비트 청소기를 연결을 조사하기 위해 모델 코드를 만드는 보석을 쓰기 않았다.

  2. ==============================

    2.당신의 database.yml을 예를 들어, 새로운 섹션을 추가

    당신의 database.yml을 예를 들어, 새로운 섹션을 추가

    other_development:
      adapter: mysql
      database: otherdb_development
      username: root
      password:
      host: localhost
    
    other_production:
      adapter: mysql
      database: otherdb_production
      username: root
      password:
      host: localhost
    

    lib 디렉토리 / other_database.rb에서 클래스 추가

    class OtherDatabase < ActiveRecord::Base
      establish_connection "other_#{RAILS_ENV}"
    end
    

    다음 OtherDatabase 예컨대에서 기본 데이터베이스 서브 클래스에없는 각 모델 :

    class MyModel < OtherDatabase
       # my model code...
    end
    
  3. ==============================

    3.나는 같은 응용 프로그램에서 2dB에 연결하려면 다음을 사용하고있다. 이로드에 나는 모든 때문에 lib 폴더에 넣어.

    나는 같은 응용 프로그램에서 2dB에 연결하려면 다음을 사용하고있다. 이로드에 나는 모든 때문에 lib 폴더에 넣어.

    require 'active_record'
    
    class OldDatabase < ActiveRecord::Base
      self.abstract_class = true
      establish_connection(
      :adapter  => 'mysql',
      :database => 'weather',
      :host     => 'localhost',
      :username => 'root',
      :password => 'password'
      )
    end
    
    class NewDatabase < ActiveRecord::Base
      self.abstract_class = true
      establish_connection(
      :adapter  => 'mysql',
      :database => 'redmine',
      :host     => 'localhost',
      :username => 'root',
      :password => 'password'
      )
    end
    
    class WeatherData < OldDatabase
    end
    
    class Board < NewDatabase
    end
    

    희망이 도움이

  4. ==============================

    4.레일 3.x를 업데이트 :

    레일 3.x를 업데이트 :

    class MyModel < ActiveRecord::Base
      establish_connection "other_#{Rails.env}"
    end
    
  5. ==============================

    5.나는 예쁜 방법은 활성 모델은 외부 데이터베이스에 대한 기본 클래스를 생성하고 모델의 그 기지에서 다음 inherite되어있는 다른 데이터베이스에 연결하는 데 있다고 생각합니다. 레일 4.2.6과 5.0.4에이 방법을 작동 벌금

    나는 예쁜 방법은 활성 모델은 외부 데이터베이스에 대한 기본 클래스를 생성하고 모델의 그 기지에서 다음 inherite되어있는 다른 데이터베이스에 연결하는 데 있다고 생각합니다. 레일 4.2.6과 5.0.4에이 방법을 작동 벌금

    예를 들면 :

    # in /models/external_db/base.rb
    require 'active_record'
    
    class ExternalDb::Base < ActiveRecord::Base
      self.abstract_class = true
      establish_connection "external_db_#{Rails.env}".to_sym
    end
    

    그리고 당신의 모델 클래스 :

    # in /models/external_db/some_model.rb
    class ExternalDB::SomeModel < ExternalDb::Base
      # your code
    end
    

    하지만 당신은 /config/database.yml에서 외부 데이터베이스를 정의해야합니다

    # in /config/database.yml
    external_db_development:
      adapter: sqlite3
      pool: 5
      timeout: 5000
      database: db/external_db_development.db
    
    external_db_production:
      adapter: sqlite3
      pool: 5
      timeout: 5000
      database: db/external_db_production.db
    
  6. ==============================

    6.6 여러 데이터베이스에 대한 기본 지원을 추가 난간 : https://edgeguides.rubyonrails.org/active_record_multiple_databases.html

    6 여러 데이터베이스에 대한 기본 지원을 추가 난간 : https://edgeguides.rubyonrails.org/active_record_multiple_databases.html

    database.yml을

    development:
      one:
        <<: *default
      other:
        <<: *default
    

    기본 클래스를 모델 :

    class OneModelBase < ActiveRecord::Base
      around_action :set_db
    
      private
    
      def set_db
        ActiveRecord::Base.connected_to(database: :one) do
          yield
        end
      end
    end
    
    class OtherModelBase < ActiveRecord::Base
      around_action :set_db
    
      private
    
      def set_db
        ActiveRecord::Base.connected_to(database: :other) do
          yield
        end
      end
    end
    

    또한 DB마다 다른 마이그레이션 및 스키마를해야합니다. DB 레일과 같은 명령을 실행 : 모든 데이터베이스를 만듭니다 만듭니다. 범위를 지정할 수 있습니다 명령, 예를 들어, 레일 DB를 : 만듭니다 : 다른.

  7. ==============================

    7.레일에서 4.1 establish_connection는 이제 기호를 취합니다

    레일에서 4.1 establish_connection는 이제 기호를 취합니다

    class OtherDbModel < ActiveRecord::Base
      establish_connection :"other_#{Rails.env}"
    end
    
  8. from https://stackoverflow.com/questions/1226182/how-do-i-work-with-two-different-databases-in-rails-with-active-records by cc-by-sa and MIT license