6

Как правильно инициализировать плагины Redmine, которые необходимо создать модель (прочитать запись базы данных), определенную в самом плагине?Как правильно создать экземпляр модели в плагине init.rb?

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

  • прочитал запись MyPluginModel из БД
  • запустить некоторый код инициализации с записью

Учитывая следующий код:

require 'redmine' 

Redmine::Plugin.register :my_redmine_plugin do 
    name 'My Redmine Plugin' 

    # ...  
end 

Rails.configuration.to_prepare do 
    m = MyPluginModel.find(1) 
    run_some_init_code(m) 
end 

Похоже, to_prepare работает до миграции:

$ bundle exec rake redmine:plugins:migrate NAME=my_redmine_plugin 

`table_structure': Could not find table 'mypluginmodel' (ActiveRecord::StatementInvalid) 
... 

Когда я комментирую блок to_prepare во время миграции, все работает нормально. Есть ли способ обнаружить процесс миграции?

ответ

0

Попробуйте использовать after_initialize вместо to_prepare. Это не проблема Redmine. Процесс инициализации Rails имеет разные крючки, которые запускаются в разное время во время запуска. См. the API docs для получения дополнительной информации.

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

+0

Когда вы просто ловили Исключение, мне все равно пришлось бы найти способ обнаружить, было ли это вызвано во время миграции (игнорировать его) или производством (выход с ошибкой). Что возвращает нас к моему первоначальному вопросу: как обнаружить миграцию? –

+1

@MichaelKrupp см. Https://stackoverflow.com/questions/1858230/how-to-detect-whether-my-rails-is-running-in-migration-or-not-in-environment-rb – bbozo

+0

@bbozo спасибо ! Теперь у меня, по крайней мере, есть обходной путь. Хотя я мог вообразить, что натыкался на всевозможные смешные кромки с этим, так как некоторые другие люди уже прокомментировали сайт, который вы связали. –