2017-02-07 1 views
1

Я подключаюсь к удаленной базе данных через SSH-туннель внутри элемента Activerecord :: Base под названием Item.Ruby on Rails - подключиться к базе приложений после запроса SSH Tunnel

у меня есть:

require 'net/ssh/gateway' 
require 'active_record' 
require 'mysql2' 

class Item < ActiveRecord::Base 
    self.table_name = "[table_name]" 
    @gateway = Net::SSH::Gateway.new(host, username) 
    @port = @gateway.open('127.0.0.1', 3306, 3309) 

ActiveRecord::Base.establish_connection(
    adapter: 'mysql2', 
    host: '127.0.0.1', 
    username: username, 
    password: password, 
    database: remote_db_name, 
    port: @port 
) 

Затем в контроллере можно успешно назвать, например Item.all и извлечь все элементы из этой удаленной таблицы. Проблема заключается в том, что тогда я иду к другой точке зрения на приложение (я использую разработать для пользователей), и я получаю эту ошибку:

Mysql2::Error: Table '[remote_database_name].users' doesn't exist: SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 ORDER BY `users`.`id` ASC LIMIT 1 

Как подключить обратно в локальную базу данных? Я пробовал использовать @gateway.shutdown! и @gateway.close(@port) с методами от контроллера, но он не работает.

ответ

0

Не используйте ActiveRecord::Base.establish_connection, вызовите establish_connection на Item класса вместо:

class Item < ActiveRecord::Base 
    establish_connection { # your connection options here } 
end 

Или, если у вас нет другого выбора, а затем хранить локальные параметры подключения к базе данных где-то перед вызовом ActiveRecord::Base.establish_connection, а затем подключить локальную базу данных вручную с помощью хранимых конфигурация:

@local_db = Rails.configuration.database_configuration[Rails.env] 
@remote_db = { 
    adapter: 'mysql2', 
    host: '127.0.0.1', 
    username: username, 
    password: password, 
    database: remote_db_name, 
    port: @port 
} 
ActiveRecord::Base.establish_connection(@remote_db) 

# when you need your local database again: 
ActiveRecord::Base.establish_connection(@local_db) 
+0

Это сработало отлично! Но теперь я развернул приложение Rails в Amazon EC2, и когда я пытаюсь подключиться, я получаю «Net :: SSH :: AuthenticationFailed», что странно, потому что я могу подключиться через SSH, используя консоль экземпляра EC2. – user3403959

+0

Я предполагаю, что ваш сервер запускается другим системным пользователем, поэтому он имеет другой ключ ssh. Вы можете проверить это, выполнив 'ps u | grep your_server_name'. Например, если вы используете 'puma' в своем проекте:' ps u | grep puma'. Первый столбец вывода будет содержать имя пользователя. Сравните его с вашим именем пользователя. Кроме того, я думаю, вам лучше создать еще один вопрос с этой проблемой, чтобы эксперты-амазонки смогли вам помочь –

Смежные вопросы