2

これが私の状況です。Account というモデルがあります。アカウントは 1 つ以上の契約を持つことができます。問題は、私がレガシー アプリケーションを扱っており、各アカウントの契約が異なるデータベースに保存されていることです。

例:

アカウント 1 の契約は account1_db.contracts にあります。アカウント 2 の契約は account2_db.contracts にあります。

データベース名は、アカウント テーブルに格納されるフィールドです。

これでレールの関連付けを機能させるにはどうすればよいですか?

これは従来の PHP アプリケーションであり、すべてを 1 つのテーブルに格納するように変更することはできません。どうにかして動作させる必要があります。

私はこれを試しましたが、うまくいきませんでした:

has_many :contracts, :conditions => [lambda{ Contract.set_table_name(self.database + '.contracts'); return '1' }]

何か案は?

4

1 に答える 1

0

データベースの移行がオプションではないのはなぜですか?

あなたはこれに間違った方法でアプローチしています。統合内の2つのシステムを緩く結合する必要があります。2つを関連付けようとすることで、相互依存関係の配列を作成し、後でそれをバックスタブすることができます。あなたが試みているアプローチは、緊密な結合を作成し、凝集度を低下させます。


ただし、質問に直接回答するには、以下を参照してください。繰り返しになりますが、以下で言うことを実装することはお勧めしませんが、技術的には解決策になります。

まず、Railsの関連付けは外部キーでのみ機能するということです。実際、すべてのデータベースの関連付けはこのように機能します。2つのオブジェクトを関連付けることの意味に反するため、外部キーなしで関連付けるActiveRecordメソッドはありません。

したがって、has_manyアソシエーションを使用してそれを実行することはできません。代わりに、has_manyの関連付けをシミュレートする関数をContractモデルに手動で作成します。

class Account
    memoize :contracts

    def contracts
     # Load from other database in here
    end

    def contracts=
    # Push to other database in here
    end
end
于 2012-06-10T22:44:37.457 に答える