Проблема с миграцией Rails для вторичной базы данных при запущенном модульном тесте

У меня есть приложение Rails 4, которое использует две базы данных MySQL (первичную, вторичную). Обе базы данных настроены для среды разработки, производства и тестирования в файле database.yml:

development:
  ...
  database: primary
  ...

production:
  ...
  database: primary
  ...
test:
  ...
  database: primary
  ...

secondary_development:
  ...
  database: secondary
  ...

secondary_production:
  ...
  database: secondary
  ...

secondary_test:
  ...
  database: secondary
  ...

На данный момент у меня есть только одна модель, которая хранится во вторичной базе данных. Ниже приведен код миграции, который создает таблицу для этой модели:

class CreateTags < ActiveRecord::Migration
 ActiveRecord::Base.establish_connection "secondary_#{Rails.env}"
 def change
   create_table :tags do |t|
     t.string :name
     t.integer :account_id
     t.timestamps
   end
 end
end

Когда я запускаю rake db:migrate, таблица во вторичной базе данных создается правильно. Но когда я запускаю rake db:migrate во второй раз, он показывает мне ошибку table already exists, которая, я думаю, связана с тем, что задача rake добавляет версию миграции в таблицу версий первичной базы данных. Я пока игнорирую это.

Но когда я запускаю какой-нибудь модульный тест с использованием rake test TEST=test/path_to_test_file.rb, он показывает мне ошибку Tags table does not exist во вторичной БД. Я проверил журналы и обнаружил, что таблица Tags создана, НО в ПЕРВИЧНОЙ базе данных, что неверно.

Итак, вкратце, как изменить код миграции, чтобы таблица Tags всегда создавалась во вторичной БД?

Я пытался:

Но у меня не работает :(

ОБНОВЛЕНИЕ 1: на основании предложения @ User089247 я попытался запустить RAILS_ENV = test rake db: create и RAILS_ENV = test rake db: migrate. Он говорит, что моя первичная база данных уже создана, что верно, но ничего не говорит о моей вторичной базе данных, потому что вторичная БД имеет отдельную конфигурацию secondary_test. Насколько я понимаю, должно быть возможно создать пользовательскую задачу рейка (или переопределить существующую), но тогда эти таксы должны использоваться rake test. Является ли это возможным ? Или я чего-то упускаю?


person Nikolay Melezhik    schedule 27.10.2014    source источник
comment
Вы также запускали: $ RAILS_ENV=test rake db:create, а затем $ RAILS_ENV=test rake db:migrate?   -  person Surya    schedule 27.10.2014
comment
Я не пробовал этого, но, насколько я понимаю, это должно помочь мне решить проблему с запуском rake db: migrate. Этот вопрос сейчас для меня не критичен, поэтому в центре внимания проблема с рейк-тестом.   -  person Nikolay Melezhik    schedule 27.10.2014
comment
gist.github.com/rafaelchiti/5575309 Похоже, вы пытаетесь сделать , также вы, database.yml, указываете вторичную базу данных для каждой среды, что мне кажется странным.   -  person jfornoff    schedule 27.10.2014


Ответы (1)


Здесь вы хотите указать использование вторичной базы данных в модели, а не только в миграции:

class Tag < ActiveRecord::Base
  establish_connection "secondary_#{Rails.env}" 
end

В этом сообщении блога есть некоторая полезная дополнительная информация, если вы собираетесь использовать вторичную базу данных для нескольких моделей: http://pragdave.me/blog/2006/01/03/sharing-external-activerecord-connections/

person eirik909    schedule 27.10.2014
comment
Спасибо за ваш ответ, но install_connection уже добавлен в модель тегов, и объект Tag можно правильно сохранять, извлекать и удалять в приложении Rails. Проблема, с которой я столкнулся, связана с модульным тестированием Rails. - person Nikolay Melezhik; 27.10.2014
comment
Мои извинения. Я неправильно понял ваш первоначальный вопрос. Похоже, что суть, указанная в последнем комментарии выше, направит вас на правильный путь. Это исходный код, который вам нужно будет переопределить / настроить, чтобы получить желаемое поведение: github.com/rails/rails/blob/master/activerecord/lib/. - person eirik909; 01.11.2014