Бывают такие ошибки, которые повторяются только на production. Для того чтобы ее отладить некоторые разработчики загружают настроки production на локальную машину для отладки этого бага, а иногда разработчики и вовсе ошибочно выполняют команды, запущенные не в том окружении. Все этого может уничножить данные на production среде! Очень мого пользователей жаловались на это и Richard Schneeman стал героем, который решил эту проблему.

Rails 5 предотвращают уничножение данных на production базе данных.

В Rails 5 добавлена новая таблица ar_internal_metadata, содержащая версию environment, которая использовалась во время миграции базы данных.

Когда в первый раз мы запускаем db:migrate, то в таблицу сохраняется значение production. Теперь, когда мы попытаемся загрузить database schema или database structure запуская rake db:schema:load или rake db:structure:load соответственно. Rails проверит environment в котором запущено Rails. Если environment не равняется production, то Rails вызовет исключение и, таким образом, предотвратит уничтожение данных.

Чтобы пропустить эту проверку среды, мы можем вручную передать DISABLE_DATABASE_ENVIRONMENT_CHECK=1 в качестве аргумента с командой db:schema:load/db:structure:load.

Вот пример запуска db:schema:load на production database.

$ rake db:schema:load

rake aborted!
ActiveRecord::ProtectedEnvironmentError:
You are attempting to run a destructive action against
your 'production' database. If you are sure you want to continue,
run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1

Как мы видим, Rails предотвратил уничтожение данных на production. А вот команда RAILS_ENV=production rake db:schema:load отработает корректно.