establish_connection似乎不支持连接

Ada*_*sek 5 join ruby-on-rails multiple-databases arel ruby-on-rails-3

我正在尝试将我的用户帐户和会话数据移动到一个单独的数据库中,以便我们最终可以跨多个应用程序共享它.

我在网上看到很多人说用来establish_connection告诉模型连接到不同的数据库,但是我无法让它工作.

配置/ 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
Run Code Online (Sandbox Code Playgroud)

应用程序/模型/ user.rb

class User < ActiveRecord::Base
  establish_connection :authentication
  has_one :person
end
Run Code Online (Sandbox Code Playgroud)

应用程序/模型/ person.rb

class Person < ActiveRecord::Base
  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

这似乎有效:

> User.connection.instance_eval { @config[:database] }
=> "authentication"
> Person.connection.instance_eval { @config[:database] }
=> "project_name_development"
Run Code Online (Sandbox Code Playgroud)

我可以User孤立地查询:

> User.where(:admin => true)
=> [ ... lots of results .. ]
Run Code Online (Sandbox Code Playgroud)

但是一旦我尝试使用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`
Run Code Online (Sandbox Code Playgroud)

ARel似乎正在使用当前的数据库而不是通过反射获得正确的数据库.

我差不多两年前发现了这个关于这个问题的非常老的错误报告,但我几乎可以肯定它是关于旧的ARel语法,我真的怀疑代码示例会再起作用了.

这甚至可能吗?

更新:通过这样做取得了一些进展:

User.joins("INNER JOIN project_name.people ON project_name.people.user_id = authentication.users.id")
Run Code Online (Sandbox Code Playgroud)

但这真的很乏味,我想加入的其中一个表是多态的.

我尝试添加:

set_table_name 'project_name.people'
Run Code Online (Sandbox Code Playgroud)

但那又回来了

NoMethodError: undefined method `eq' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

在我看来,Rails3实际上并不支持多个模式.我错了吗?

jsc*_*orr 1

您是否考虑过将其从应用程序层中取出并仅使用 MySQL 复制来复制某些表?