Rails не воссоздает представления mysql в тестовой базе данных, даже когда config.active_record.schema_format =: sql - PullRequest
6 голосов
/ 20 декабря 2010

У нас есть некоторые mysql Views в наших базах разработки и тестирования, которые были созданы с помощью оператора execute (sql) в процессе миграции.По умолчанию в Rails schema.rb создает эти представления в виде таблиц.Если для config.active_record.schema_format задано значение: sql, эти представления вообще не создаются.

Существует ли параметр, обеспечивающий повторное создание этих представлений в тестовой базе данных?

Еслинет, может кто-нибудь предложить обходной путь?

NB, show create table для этого представления выглядит примерно так:

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `sales_reports` AS select ...

, и представление включено в show tables

После расследования похоже, что activerecord делает это намеренно.

active_record / connection_adapters / mysql_adapter.rb

Есть ли для этого веская причина?

1 Ответ

6 голосов
/ 20 сентября 2013

Обязательно прочитайте этот раздел руководства .

Убедитесь в блоке приложения в config/application.rb:

config.active_record.schema_format = :sql

Тогда вы можете использовать этот рейкзадача вывести схему, хотя она должна быть выгружена / обновлена ​​всякий раз, когда вы выполняете миграцию / etc.из-за этого параметра выше:

rake db:structure:dump

Ваша структура должна быть в db/structure.sql.Он должен выглядеть как файл схемы дампа из вашей БД, т.е. не включая данные, за исключением данных миграции, которые будут помещены в конце (по крайней мере, для postgres).

При использовании config.active_record.schema_format = :sql your db/schema.rb - это , а не обновляется по умолчанию всякий раз, когда вы выполняете миграцию, поскольку db/schema.rb не означает, что это дамп SQL полной схемы.Тем не менее, некоторые инструменты, такие как IntelliJ Rubymine и IDea с плагином Ruby, такие как этот файл, должны быть там, поэтому в ваш Rakefile добавьте их (как упоминалось здесь ):

Rake::Task["db:migrate"].enhance do
  if ActiveRecord::Base.schema_format == :sql
    Rake::Task["db:schema:dump"].invoke
  end
end

Rake::Task["db:rollback"].enhance do
  if ActiveRecord::Base.schema_format == :sql
    Rake::Task["db:schema:dump"].invoke
  end
end

Когда тестБД воссоздан Rails, он будет использовать db/structure.sql в качестве базы при использовании config.active_record.schema_format = :sql.Если вы выполняете откат или вносите изменения в базу данных извне и сокращаете ее с помощью приведенной выше команды или выполняете миграцию и т. Д., Она также обновит db/structure.sqldb/schema.rb с помощью указанных выше задач, хотя db/schema.rb не полностью охватываетинформация из дампа схемы).

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