6

プラグイン自体で定義されたモデルをインスタンス化する(データベースレコードを読み込む)必要があるRedmineプラグインを正しく初期化するにはどうすればよいですか?プラグインinit.rbでモデルを正しくインスタンス化する方法は?

たとえば、my_redmine_pluginには、MyPluginModelのプラグインがあります。プラグインの初期化時に、私は

  • したいレコードの次のコードを考える

MyPluginModel実行

  • DBからいくつかの初期化コードのレコードを読み:

    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

    to_prepareの代わりにafter_initializeを試してみてください。これはRedmineの問題ではありません。 - Railsの初期化プロセスには、起動時に異なる時間に実行される異なるフックがあります。詳細については、the API docsを参照してください。

    更新:それはまだマイグレーションに役立つことはないかもしれません - あなたはあなたのフックでそのエラーから救助することができます。

    +0

    単に例外をキャッチするとき、私はそれが移行(無視)または生産(エラーで終了)中に発生したかどうかを検出する方法を見つける必要があります。どのようにマイグレーションを検出するのですか? –

    +1

    @MichaelKruppを参照してください。https://stackoverflow.com/questions/1858230/how-to-detect-whe-my-rails-is-running-in-migration-or-not-in-environment-rb – bbozo

    +0

    @bbozoありがとう!今私は少なくとも回避策があります。他の人があなたがリンクしているサイトについて既にコメントしているので、私はこれであらゆる種類の面白いケースに遭遇すると想像することができます。 –

    関連する問題