最終的に複数のアプリケーションで共有できるように、ユーザー アカウントとセッション データを別のデータベースに移動しようとしています。
モデルに別のデータベースに接続するように指示するために使用することをオンラインで多くの人が言っているのを見てきましたestablish_connection
が、これを機能させることができません。
config/database.yml
development:
adapter: mysql2
encoding: utf8
reconnect: true
pool: 5
host: localhost
database: project_name_development
authentication:
adapter: mysql2
encoding: utf8
reconnect: true
pool: 5
host: localhost
database: authentication
アプリ/モデル/user.rb
class User < ActiveRecord::Base
establish_connection :authentication
has_one :person
end
アプリ/モデル/person.rb
class Person < ActiveRecord::Base
belongs_to :user
end
これはうまくいっているようです:
> User.connection.instance_eval { @config[:database] }
=> "authentication"
> Person.connection.instance_eval { @config[:database] }
=> "project_name_development"
User
単独でクエリを実行できます。
> User.where(:admin => true)
=> [ ... lots of results .. ]
しかし、使用しようとするとすぐjoin
に壊れます:
> User.joins(:person)
ActiveRecord::StatementInvalid: Mysql2::Error: Table 'authentication.people' doesn't exist: SELECT `users`.* FROM `users` INNER JOIN `people` ON `people`.`user_id` = `users`.`id`
ARel は、リフレクションによって正しいデータベースを取得するのではなく、現在のデータベースを使用しているようです。
この問題について、ほぼ 2 年前のこの非常に古いバグ レポートを見つけましたが、それが古い ARel 構文に関するものであることはほぼ確実であり、コード例がもう機能するかどうかは本当に疑わしいです。
これは可能ですか?
更新:これを行うことで少し前進しました:
User.joins("INNER JOIN project_name.people ON project_name.people.user_id = authentication.users.id")
しかし、それは本当に退屈で、私が参加したいテーブルの 1 つはポリモーフィックです。
追加してみました:
set_table_name 'project_name.people'
しかし、それは戻ります
NoMethodError: undefined method `eq' for nil:NilClass
Rails3 は実際には複数のスキーマをサポートしていないようです。私が間違っている?