我有一个延迟的工作,对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代码。
所以我的问题是。我做错什么了吗?或者更重要的是,我该如何做正确的事?
答案 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')
无论您是在应用程序控制器请求还是后台作业中调用它。