工作延误;它是否在过滤之前跳过

时间:2012-06-18 01:13:03

标签: ruby-on-rails activerecord delayed-job before-filter

我有一个延迟的工作,对postgresql中的公共架构运行完美 然而,我的大多数操作都是针对其他模式(每个客户端一个)

为了处理不同的模式,我按照说明操作,并在我的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代码。

所以我的问题是。我做错什么了吗?或者更重要的是,我该如何做正确的事?

2 个答案:

答案 0 :(得分: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控制台并执行任何数据库查询来测试它,您应该会看到多次显示“调用自定义连接方法”消息。

答案 1 :(得分:0)

如果您想操作Postgres和模式的ActiveRecord搜索路径,您可以使用像公寓一样的全功能宝石:https://github.com/bradrobertson/apartment

您可以切换到新架构:

Apartment::Database.switch('database_name')

无论您是在应用程序控制器请求还是后台作业中调用它。