Переключение соединения на ActiveRecord :: Схема - PullRequest
6 голосов
/ 20 января 2011

Я использую рельсы 2.3.5 и mysql.

У меня есть модель TableA и другая модель TableB.TableA полностью в порядке .. но мне нужно поменять местами соединения для TableB.Я подключаюсь к другому серверу в другом месте, поэтому я должен проверить, существует ли эта таблица.Если этого не произойдет, я создам новую таблицу.

TableB.establish_connection(new_database_params)
unless TableB.table_exists?
  ActiveRecord::Base.establish_connection(new_database_params)
  ActiveRecord::Schema.define do
    create_table :table_bs do |t|
      t.column :text, :string
    end
  end
  ActiveRecord::Base.establish_connection("#{RAILS_ENV}")      
end

Я заметил, что TableB.establish_connection (new_database_params) соединяет меня с новым сервером.Это совершенно нормально.

Когда я пытаюсь создать новую таблицу, мне все равно нужно вызвать ActiveRecord :: Base, чтобы поменять соединение.Есть ли способ поменять соединение на ActiveRecord :: Schema?(похоже на Model.establish_connection?)

1 Ответ

8 голосов
/ 07 марта 2012

Концептуально у меня была точно такая же проблема. Я хотел создать подкласс ActiveRecord :: Base и построить схему для этого соединения. Мне потребовалось много времени, чтобы разобраться, и я погрузился в ActiveRecord :: Base, Schema и Migration, но я нашел решение, которое работает, и оно действительно очень просто.

Под капотом Schema является подклассом Migration, и она вызывает instance_eval для блока, который вы предоставляете. Следовательно, мы находимся в области действия класса Migration и можем изменить его переменную экземпляра @connection для подключения подкласса ActiveRecord :: Base, т.е.

ActiveRecord::Schema.define do
  @connection = TableB.connection
  create_table :table_bs do |t|
    t.column :text, :string
  end
end

Я понимаю, что этот ответ, вероятно, слишком поздно! Но это все еще может быть кому-то полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...