別の結合モデル AccountOwnership を介して、2 つのモデル User と CustomerAccount の間の has_many :through 関係をセットアップしようとしています (users と account_ownerships テーブルは 1 つのデータベースにあり、db1 と言い、customer_accounts テーブルはリモート db にあり、db2 とします)。
関連付けを設定する関連コードは次のとおりです。
class User < ActiveRecord::Base
has_many :account_ownerships, :dependent => :destroy
has_many :companies, :through => :account_ownerships
end
class AccountOwnership < ActiveRecord::Base
belongs_to :user
belongs_to :company, :class_name => "Reporting::CustomerAccount"
end
class CustomerAccount < Reporting::Base
set_table_name 'customers'
establish_connection("db2_#{RAILS_ENV}")
end
config/database.yml (ここには示されていませんが、構成は正しいです)
development:
reconnect: false
database: db1
pool: 5
db2_development:
reconnect: false
database: db2
host: different.host
pool: 5
スクリプト/コンソールで
a = AccountOwnership.new(:user_id => 2, :company_id => 10)
a.user ## Returns the correct user
a.company ## returns the correct CustomerAccount instance
また
a.user.account_ownership ## returns a as anticipated
しかし
a.user.companies ## produces the following error:
#ActiveRecord::StatementInvalid: Mysql::エラー: テーブル #'db2.account_ownerships' が存在しません: SELECT `customers`.* FROM #`customers` INNER JOIN `account_ownerships` ON `customers`.id = #`account_ownerships`.company_id WHERE ((`account_ownerships`.user_id = 4))
ここでの問題は、「account_ownerships」および「users」テーブルが 1 つのデフォルト データベース (db1 など) に含まれており、「customers」テーブルが別のデータベース (db2 など) に含まれていることです。データベースへの接続は適切に構成されていますが、ルックアップ中に使用可能なデータベース接続オブジェクトが 1 つしかないため、Rails は db2 で account_ownerships データベースを見つけようとして失敗します。
同じ db 接続を使用して 2 つの異なるデータベースに接続する方法が見つからないため、設計/ロジックに欠陥があるように見えますが、設計を変更せずに回避策があるかどうかを確認したいと思います。(db2 は私の管理下にないため、設計を変更するのは気が進まない)
account_ownerships テーブルを db2 に移動することでこの問題を回避できるようですが、これは少なくとも私にとっては理想的ではありません。
Railsでこの関連付けをセットアップするための代替メカニズム/スキーマはありますか?
前もって感謝します。M