別のRailsモデルで別のデータベース接続を使用する必要があります。それを行うのにそれほどハッキーではない方法はありますか?
リンクや検索キーワードはすばらしいです:)
mikejは正しいです。ただし、モデルコードを少しすっきりと接続するgemを作成しました チェックアウト 。
新しいセクションを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
同じアプリで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の更新:
class MyModel < ActiveRecord::Base
establish_connection "other_#{Rails.env}"
end
Rails 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ごとに異なる移行とスキーマがあります。 Rails db:create
のようなコマンドを実行すると、すべてのデータベースが作成されます。コマンドのスコープを設定できます。 Rails db:create:other
。
アクティブなモデルを持つ別のデータベースに接続するための最も美しい方法は、外部データベースの基本クラスを作成し、モデルのその基本から継承することだと思います。この方法は、Rails 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
Rails 4.1+ establish_connection
がシンボルを取ります:
class OtherDbModel < ActiveRecord::Base
establish_connection :"other_#{Rails.env}"
end