2011-09-06 4 views
2

새 연결이 만들어 질 때마다 (동일한 연결에서) 간단한 SQL 행을 실행하고 싶습니다. (동일한 연결에서)ActiveRecord 연결 : 사용자 정의 초기화 프로그램

왜? 포스트그레스 사용하기, "set application_name = 'abc';" 내 데이터베이스 서버에 통계를 쿼리 할 때 연결을 사용하여 응용 프로그램을 추적 할 수있게 해줍니다.

내가 이것을 할 수있는 것을 보지 못했습니다.

답변

1

나는 최근에 비슷한 문제를 해결했다. 연결 후 트랜잭션 격리 수준을 변경했습니다. 이 예제가 도움이 될 것입니다. 조언을 기반으로합니다. in the final example on this blog post.

# lib/active_record/application_name.rb 
module ActiveRecord 
    module ApplicationName 
    def self.included(base) 
     unless base.respond_to? :establish_connection_with_application_name 
      base.extend ClassMethods 
      base.class_eval do 
      class << self 
       alias_method_chain :establish_connection, :application_name 
      end 
      end 
     end 
    end 

    module ClassMethods 
     def establish_connection_with_application_name(*args) 
     result = establish_connection_without_application_name(*args) 
     ::ActiveRecord::Base.connection.execute("set application_name = 'abc';") 
     result 
     end 
    end 
    end 
end 

# lib/patches/active_record.rb 
require 'active_record/application_name' 

class ActiveRecord::Base 
    include ActiveRecord::ApplicationName 
end 


# config/initializers/patches.rb 
require 'patches/active_record' 
+0

이것은 작동하지 않지만 아이디어가있었습니다. Activerecord는 establish_connection을 통해 internaly를 전달하지 않습니다. 대신 풀을 사용합니다. ActiveRecord :: ConnectionAdapters :: ConnectionPool의 new_connection 메서드를 방문하여 코드를 추가했습니다. 잘 했어. 시간을 찾으면 좋은 코드를 보석으로 공개 할 것입니다. – Thierry

+0

아, 멋지다. 필자의 환경에서는 유니콘의 post_fork 블록에서 establish_connection을 명시 적으로 호출하기 때문에 나에게 도움이되었다. 그래도 조언 주셔서 감사합니다. –

관련 문제