5

Я пытаюсь переместить мою учетную запись пользователя и данные сеанса в отдельную базу данных, чтобы мы могли поделиться ею в нескольких приложениях.install_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, и я действительно сомневаюсь, что примеры кода будут работать больше.

Возможно ли это?

Update: сделал небольшой прогресс, делая это:

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

Я заметил ту же проблему при попытке перенести мой сайт 2.3 на rails3. Кажется, что Arel 2.0.6 поддерживает соединение с исходной базой данных и не понимает, когда db изменен с помощью connection_connection. Кажется, что Areel HEAD улучшается, но я замечаю другие ошибки. Возьмите рельсы 3.0.4 ... –

+0

Я уверен, что Rails этого не поддерживает. – jschorr

+2

@karudzo В документах Rails API говорится, что ActiveRecord поддерживает использование нескольких БД.Если вы не можете использовать 'join', это не относится к« поддержке »в моей книге. –

ответ

1

Вы задумывались над тем, чтобы вывести его из уровня приложения и просто реплицировать определенные таблицы только с помощью репликации MySQL?

+0

Это может быть необходимо. Хорошее предложение. –