我正在尝试将我的用户帐户和会话数据移动到一个单独的数据库中,以便我们最终可以跨多个应用程序共享它。
我在网上看到很多人说使用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
应用/模型/ 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似乎正在使用当前数据库而不是通过反射获得正确的数据库。
我差不多两年前发现了this very old bug report关于这个问题,但我几乎可以肯定它是关于旧的ARel语法,我真的怀疑代码示例是否会再起作用。
这甚至可能吗?
更新:通过这样做取得了一些进展:
User.joins("INNER JOIN project_name.people ON project_name.people.user_id = authentication.users.id")
但这真的很乏味,我想加入的其中一个表格是多态的。
我尝试添加:
set_table_name 'project_name.people'
但返回
NoMethodError: undefined method `eq' for nil:NilClass
在我看来,Rails3实际上并不支持多个模式。我错了吗?
答案 0 :(得分:1)
您是否考虑过将其从应用层中取出并仅使用MySQL复制复制某些表?