2012-06-18 2 views
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 코드는 호출되지 않습니다.

내 질문은. 내가 뭐 잘못 했어요? 또는 더 중요한 것은 어떻게하면 올바르게 할 수 있습니까?

+0

왜 연기 된 작업이 컨트롤러에서 실행됩니까? –

+0

Humm .. 좋은 지적. 왜 데이터베이스 필터가 컨트롤러에 있어야 할까? :) 나는 당신의 요점을 .. 어디서 U 필터 코드를 넣을까요? – baash05

+0

주어진 current_user는 모델 범위에 포함되지 않습니다. 필터가 작동하기 전에 필터가 관련되는 곳이 이상한 선택을하는 것 같습니다. – baash05

답변

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 

에 다음 코드를 추가합니다. 레일 콘솔을 열고 데이터베이스 쿼리를 수행하여 테스트 할 수 있으며 여러 번 표시된 "사용자 지정 연결 방법"메시지가 표시되어야합니다.

+0

그 문제는 작업이 데이터베이스 호출 더미를 가지고 있고 postgresql 예제 (데이터베이스를 변경하기 위해 컨트롤러를 사용함)를 사용했기 때문에 모든 클래스에 추가해야한다는 것입니다. – baash05

+0

클래스 메소드가 호출 될 때마다 자동으로 메소드가 on_before_filter로 실행되기를 원하십니까? – lee

+0

그것은 포스트 그레스 스키마를 사용하기 위해 당신이해야 할 일종입니다. 모델에 어떤 스키마를 타겟팅하는지 알려줍니다. 응용 프로그램 컨트롤러에서는 데이터베이스 호출 전에 호출되므로 모든 DB 읽기/쓰기에서 올바른 스키마가 선택되었는지 확인합니다. DJ에서 데이터베이스에 액세스 할 때도 마찬가지였습니다. – baash05

0

당신은 포스트 그레스 및 스키마에 대한 액티브 검색 경로를 조작 할 경우에 당신은 아파트와 같은 모든 기능을 갖춘 보석을 사용할 수 있습니다 https://github.com/bradrobertson/apartment

당신은 새 스키마로 전환 할 수 있습니다

:에 관계없이 경우

Apartment::Database.switch('database_name') 

응용 프로그램 컨트롤러 요청 또는 백그라운드 작업에서 이것을 호출합니다.

+0

경로 설정에 문제가 없습니다. 보석 없이도 문제는 스위치를 실행하는 코드가 어디에 있습니까? 나는 그것을 모든 일에 맡기고 싶지 않습니다. 그래도 도움을 주셔서 감사합니다. 나는 보석을 살펴볼 것이다. – baash05