0

postgresqlのパブリックスキーマに対して完全に実行される遅延ジョブがあります。
ただし、私の操作のほとんどは、他のスキーマ(クライアントごとに1つ)に対して行われます。

さまざまなスキーマを処理するために、指示に従い、before_filter(アプリケーションコントローラー内)に検索パスを切り替えるコードを配置しました。

私が気づきました。before_filterのコードは、通常の操作では完全に呼び出されますが、遅延ジョブではまったく呼び出されません。

私は、入り口を示すために、私が考えることができる最も単純なものを除いて、すべてをトリミングしてトリミングしました。

class ApplicationController < ActionController::Base
  protect_from_forgery

  def write_to_log(text)
    File.open('c:\temp.txt', 'ab') do |f|
      f.write text + "\r\n"
      f.close
    end
  end
  before_filter :on_before_filter
  def on_before_filter
    write_to_log('hey dave');
    return if(use_token() == false);
    set_active_schema if(goto_log_in? == false);
  end

ワーカークラスのコード

def run_job(id)
  upload = Upload.find(id)
  upload.run_job();
end
handle_asynchronously :run_job, :priority => 10, :queue => 'public'  

かなり標準的なものですか?ジョブ内のコードは実行されますが、before_filterコードは呼び出されません。

だから私の質問はです。私は何か間違ったことをしましたか?またはもっと重要なことに、どうすれば正しいことをすることができますか?

4

2 に答える 2

1

このアプローチはお勧めしません。私はこのコードを提供することによってあなたの質問に答えているだけです。基本的に、データベースへの呼び出しを試みる前にコードを実行する必要があるため、ActiveRecordにモンキーパッチを適用できます。次のコードをに追加しますconfig/initializers/active_record_monkey_patch.rb

class ActiveRecord::ConnectionAdapters::ConnectionPool
  # create an alias for the old 'connection' method
  alias_method :old_connection, :connection

  # redefine the 'connection' method
  def connection
    # output something just to make sure the monkey patch is working
    puts "*** custom connection method called ***"

    # your custom code is here
    write_to_log('hey dave');
    return if(use_token() == false);
    set_active_schema if(goto_log_in? == false);

    # call the old 'connection' method
    old_connection
  end

end

カスタム接続メソッドが頻繁に呼び出されるようになり、コントローラーがなくても機能します。Railsコンソールを開いてデータベースクエリを実行することでテストでき、「カスタム接続メソッドが呼び出されました」というメッセージが数回表示されるはずです。

于 2012-06-18T03:44:47.637 に答える
0

PostgresとスキーマのActiveRecord検索パスを操作する場合は、アパートのようなフル機能のgemを使用できます:https ://github.com/bradrobertson/apartment

新しいスキーマに切り替えることができます。

Apartment::Database.switch('database_name')

これをアプリケーションコントローラ要求またはバックグラウンドジョブで呼び出すかどうかは関係ありません。

于 2012-06-19T05:56:38.770 に答える