2009-08-04 13 views
41

異なるRailsモデルで異なるデータベース接続を使用する必要があります。それを行うにはあまりにもハッピーな方法はありますか?アクティブなレコードを持つ2つの異なるデータベースをどのように扱うのですか?

任意のリンクや検索キーワードが:)

+0

単一のモデル上の異なるフィールドが実際に異なるデータベースまたはjuアプリケーション内のさまざまなモデルが異なるデータベースから来ていますか? – mikej

+0

異なるデータベースサーバーの異なるモデル – gustavgans

+0

@gustavgans - mikejへの返信に基づいて、あなたの質問を編集して少し鮮明にしました。 –

答えて

9

をmikejは正しいです。私はしかし、少しクリーナー、check it outを接続するモデルコードを作る宝石を書いた。

+0

上記のリンクは壊れています。正しい例は次のとおりです。http://github.com/cherring/connection_ninja – abeger

+1

@railsninjaありがとうございます。どのようにして2つのデータベースで移行を実行できるか知っています。 – maxiperez

112

があなたの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 
+4

'lib/other_database.rb'に' self.abstract_class = true'を追加する必要がありました – ybart

12

私は同じアプリケーションで2 dbに接続するために以下を使用しています。私はそこにあるすべてがロードされているので、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 

のRails 3.xの

+0

Rakeタスクで古いアプリから新しいアプリにデータを移行する必要があり、同様のアプローチを使用しました。違いは、Rakeタスクは ':task_name =>:environment'を使用しているため、Rails環境が利用できるため、新しいアプリケーションのモデルは通常どおりに使用でき、database.ymlから取得できます。古いアプリのモデルだけが、その情報をあなたが示すように定義する必要があります。 –

9

更新役に立てば幸い:レールで

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

を今すぐシンボルを取る4.1以上establish_connection

class OtherDbModel < ActiveRecord::Base 
    establish_connection :"other_#{Rails.env}" 
end 
1

私がきれいだと思いますアクティブなモデルを使用して別のデータベースに接続する方法は、外部データベースのためのベースクラスを作成してからそれを継承しますあなたのモデルのベース。 この方法は、例えば、レール4.2.6と5.0.4

で正常に動作します:

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

しかし、あなたがに/ configに外部データベースを定義する必要があります。

# 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 

そして、あなたのモデルクラスで/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 
関連する問題