5

最終的に複数のアプリケーションで共有できるように、ユーザー アカウントとセッション データを別のデータベースに移動しようとしています。

モデルに別のデータベースに接続するように指示するために使用することをオンラインで多くの人が言っているのを見てきました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 は実際には複数のスキーマをサポートしていないようです。私が間違っている?

4

1 に答える 1

1

それをアプリ層から取り出し、MySQLレプリケーションのみで特定のテーブルをレプリケートすることを考えましたか?

于 2011-01-20T22:20:55.717 に答える