Есть ли способ автоматически иметь "rake db: migrate RAILS ENV=test" после "rake db: migrate" в среде разработки?


Есть ли способ автоматически делать rake db:migrate RAILS_ENV=test после каждого rake db:migrate, когда в среде разработки?

У меня есть охранник и еще охрана-rspec работает, и я действительно раздражен из-за неудачных тестов, даже если он работает вручную в браузере.

Каждый раз, когда у меня была пауза от разработки, мне стоило не менее 15 минут, чтобы понять, что я просто забыл позвонить rake db:migrate:test после изменения базы данных.

Так как я уже использую охранник я подумал о том, чтобы добавить охранник-грабли к проекту тоже, но я не знаю, какой файл мне стоит посмотреть. При наблюдении за развитием .sqlite3, rake db:migrate RAILS_ENV=test будет уволен каждый раз, когда я что-то делаю со своими записями через браузер, так что это не совсем то, что я хочу.

Может ли кто-нибудь помочь мне с моей проблемой?
6 25

6 ответов:

Возможно, просто создайте псевдоним команды в вашем файле .bashrc.

~/.bashrc

alias rake_db_migrate='rake db:migrate db:test:prepare'

терминал

$ rake_db_migrate

Я предпочитаю использовать псевдоним таким образом:

В вашем ~/.bashrc

alias migrate='rake db:migrate && rake db:test:prepare'

Легко потратить 30 минут, пытаясь понять, почему ваши тесты не проходят, только чтобы вспомнить, что вы не сбросили базу данных. Это решит эту проблему.

Быстрее: alias migrate='rake db:migrate db:test:prepare' (добавьте это в свой .bashrc, он загрузит рельсы только один раз)

Вариант, который мне очень нравится, - это переопределить фактическую задачу в другом скрипте rake. Это будет вызвано автоматически после запуска миграции. Вот так я всегда создаю диаграмму ERD после переноса базы данных:

# lib/tasks/database.rake
namespace :db do
  desc 'Additional migrate task that creates the diagram'
  task :migrate do
    if Rails.env.development?
      Rake::Task['diagram:erd'].invoke
    end
  end
end

Итак, в вашем случае:

# lib/tasks/database.rake
namespace :db do
  desc 'Additional migrate task that creates the diagram'
  task :migrate do
    `rake db:migrate RAILS_ENV=test`
  end
end

Другой подход заключается в следующем, который клонирует вашу новую схему в тестовую базу данных:

rake db:migrate db:test:clone

Я использую этот псевдоним:
alias rake_db_migrate='rake db:migrate && rake db:migrate RAILS_ENV=test'

Потому что rake db:test:prepare устарело.

Причина, по которой я использую это, заключается в том, что наш проект использует pg_search (postgreSQL) вместе со структурой.sql (не схема.rb) и почему-то запуск rake db:migrate не подготавливает тестовую базу данных.

В ответ на ваш первоначальный вопрос об использовании guard-rake, вы можете посмотреть db/schema.rb, так как это будет обновляться всякий раз, когда вы переносите базу данных. Однако этот файл также будет изменен, если вы выполните откат, поэтому вам, вероятно, придется вытащить версию миграции из строки определения схемы в db/schma.rb или использовать rake db:test:prepare вместо rake db:migrate RAILS_ENV=test.

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