2009-05-21 16 views
1

私のアプリケーションと開発では、1つのモデルに別のDBがあります。 モードでは、接続は正常に動作していますが、実際には動作しません。プロダクションでのDB接続の問題

production: 
    adapter: mysql 
    host: myhost 
    username: root 
    password: 
    database: production_db 

users_production: 
    adapter: mysql 
    host: myhost 
    username: root 
    password: 
    database: other_db 

他のデータベースに接続するモデルは、ユーザと呼ばれますが、それはother_dbに参照する の表は、smf_usersはので、私のUser.rbが 次のようになります:私は本番では

class User < ActiveRecord::Base 
    establish_connection "users_#{RAILS_ENV}" 
    set_table_name "smf_users" 
end 

このエラーが発生する:

Mysql::Error: Table 'production_db. smf_users' doesn't exist: 

間違ったデータベースに接続しようとしているため、012ではありません正しい表が見つかりました。私が言うように、これは開発モードで動作します。

提案がありますか?

+0

どの時点でエラーがスローされますか?あなたはUser.find()のようなものを試していますか、それとも関係を通してですか? – catalpa

答えて

1

関連付けを行うときに奇数のエラーが表示さ複数のデータベースを使用しているとき、私を見つけました。あなたはそこに別のモデルを持っている可能性がありますbelongs_to :usersとあなたはそれがちょうど働くことを期待している?さもなければ、あなたはキャッシングを見なければなりません - Railsが余分なデータベースの接続データを正しくキャッシュしていない可能性があります。

+0

はい、そうかもしれません。この場合、belongs_to:ユーザーは失敗しますか? – arfon

+0

私はそう思っており、それはあなたが調べているエラーを引き起こすでしょう。私はあなたが複数のデータベースにわたって協会のDSLを使用できるとは思わない。関連付けられたモデルで独自の:usersメソッドを作成し、その中にUser.all:conditions => ['associated_id =?'、id]と言うことができます。別のオプションは、after_saveコールバックを使用してUserテーブルを他のデータベースにミラーリングすることです。 – austinfromboston

+0

はい、十分です。 – arfon

0

試してみてください。

establish_connection configurations[RAILS_ENV]["users_#{RAILS_ENV}"] 
User.connection 

establish_connectionは、接続情報のハッシュを必要とします。これは、database.ymlから返されるはずです。あなたは、次のようなメッセージのためにあなたのログをチェックしたい場合があります

「users_productionデータベースが構成されていません」

そのメッセージは、ActiveRecordのによってスローされます::ベースでは見つけることができない場合database.ymlの文字列による構成。

+0

ありがとうございますが、私はそのエラーが表示されないので、設定を見つけるのは確信しています。 ActiveRecordで接続をキャッシュすることとは何か関係があると私は確信しています。 – arfon

+0

プロダクションコンソールで設定['users_production']を実行しようとしましたが、アクセス可能であることを確認しましたか? – catalpa

+0

これは非常に奇妙です。 User.connectionとタイプするとコンソールでうまく動作しますが、Passengerを実行すると間違ったDBに衝突します – arfon