Воссоздание базы данных: разгребать задачи, используя базу данных, в итоге загружая модели / другие файлы? - PullRequest
0 голосов
/ 15 марта 2012

У меня есть много мест в моем коде, которые на самом деле вызывают поиск активных записей.Например, в движке блога у меня может быть таблица tags, которая соответствует модели activerecord Tag.Предположим, по какой-то причине, что я хочу, чтобы произошла особая логика, если пост создается с тегом где tag.description == 'humor'.Тогда у меня может быть метод в модели:

class Tag < ActiveRecord::Base

  def self.humor_tag
    find_by_description('humor')
  end

end

Независимо от того, плохой это дизайн или нет, это вызывает у меня безумные проблемы при использовании команд rake для построения базы данных.Скажем, позже я закончил свою разработку и хочу развернуть в производство.Поэтому я беру дампированный файл schema.rb, а затем хочу загрузить новую структуру базы данных из этого schema.rb или, в качестве альтернативы, просто запустить мои миграции для создания производственной базы данных.

RAILS_ENV=production rake db:schema:load

Проблема в том, что в производственной среде команда rake загружает каждую модель.Когда он пытается загрузить метод Tag#humor_tag, он выдает ошибку, которая останавливает процесс:

rake aborted!
Table 'production_database.tags' doesn't exist

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

Что ты должен делать?Похоже, что где-то может быть какая-то конфигурация, чтобы вы могли сказать rake о том, что нужно игнорировать обращения к таблицам базы данных перед созданием каких-либо таблиц.

Ответы [ 2 ]

0 голосов
/ 16 марта 2012

Я не совсем удовлетворен этим ответом, но если кто-то ответит на этот вопрос и столкнется с подобной проблемой, это может быть полезно. Для перемещения по базе данных в ситуации, когда вы обычно rake db:schema:load или просто создаете ее и запускаете миграции, вы можете альтернативно загрузить базу данных из SQL (или, вероятно, других технологий баз данных).

rake db:structure:dump

Эта команда сбросит структуру базы данных в файл, который затем сможет воссоздать ее. Для меня он создал файл db/development_dump.sql, который содержал вызовы для создания всех таблиц и индексов, но не копировал данные, как в обычном дампе sql. Затем я переместил этот файл в свою производственную базу данных и запустил его:

mysql prod_database < development_dump.sql

Это не отвечает на поставленный вопрос, но может быть актуально для кого-то, сталкивающегося с подобной проблемой.

0 голосов
/ 16 марта 2012

Я бы предложил заменить запросы методами класса областями действия: http://guides.rubyonrails.org/active_record_querying.html#scopes

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

class Post < ActiveRecord::Base
  scope :published, Proc.new { where(:published => true) }
end

, чтобы запретить запуск области во время инициализации.

...