0

我有一个延迟的工作,可以完美地针对 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 代码不会被调用。

所以我的问题是。我做错什么了吗?或者更重要的是,我怎样才能做正确的事情?

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 回答