異なるRailsモデルで異なるデータベース接続を使用する必要があります。それを行うにはあまりにもハッピーな方法はありますか?アクティブなレコードを持つ2つの異なるデータベースをどのように扱うのですか?
任意のリンクや検索キーワードが:)
異なるRailsモデルで異なるデータベース接続を使用する必要があります。それを行うにはあまりにもハッピーな方法はありますか?アクティブなレコードを持つ2つの異なるデータベースをどのように扱うのですか?
任意のリンクや検索キーワードが:)
をmikejは正しいです。私はしかし、少しクリーナー、check it outを接続するモデルコードを作る宝石を書いた。
があなたの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
'lib/other_database.rb'に' self.abstract_class = true'を追加する必要がありました – ybart
私は同じアプリケーションで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の
Rakeタスクで古いアプリから新しいアプリにデータを移行する必要があり、同様のアプローチを使用しました。違いは、Rakeタスクは ':task_name =>:environment'を使用しているため、Rails環境が利用できるため、新しいアプリケーションのモデルは通常どおりに使用でき、database.ymlから取得できます。古いアプリのモデルだけが、その情報をあなたが示すように定義する必要があります。 –
更新役に立てば幸い:レールで
class MyModel < ActiveRecord::Base
establish_connection "other_#{Rails.env}"
end
を今すぐシンボルを取る4.1以上establish_connection
:
class OtherDbModel < ActiveRecord::Base
establish_connection :"other_#{Rails.env}"
end
私がきれいだと思いますアクティブなモデルを使用して別のデータベースに接続する方法は、外部データベースのためのベースクラスを作成してからそれを継承しますあなたのモデルのベース。 この方法は、例えば、レール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
単一のモデル上の異なるフィールドが実際に異なるデータベースまたはjuアプリケーション内のさまざまなモデルが異なるデータベースから来ていますか? – mikej
異なるデータベースサーバーの異なるモデル – gustavgans
@gustavgans - mikejへの返信に基づいて、あなたの質問を編集して少し鮮明にしました。 –