Ответ 1
Единственный способ обойти это - переопределить функцию configure_connection в ActiveRecord. Для этого я бы рекомендовал сделать функцию ApplicationController с именем skip_sql? чтобы проверить, хотите ли вы пропустить функцию configure_connection для некоторых комбинаций действий контроллера #:
class ApplicationController def skip_sql? params[:controller] == "..." && params[:action] == "..." end end
Затем сделайте эту функцию доступной для ваших классов и моделей:
module SkipSql module Controller def self.included(base) base.prepend_before_filter :assign_skip_sql_to_models end def assign_skip_sql_to_models ActiveRecord::Base.skip_sql_proc = proc {send(:skip_sql?)} end end module Model def self.included(base) base.extend ClassMethods end module ClassMethods attr_accessor :skip_sql_proc def skip_sql? ActiveRecord::Base.skip_sql_proc.call if ActiveRecord::Base.skip_sql_proc end end def skip_sql? self.class.skip_sql? end end end Object.send :include, SkipSql::Model::ClassMethods ActionController::Base.class_eval {include SkipSql::Controller}
Затем пропустите sql только на комбинациях действий контроллера #, которые вы установили:
class ActiveRecord::ConnectionAdapters::MysqlAdapter def configure_connection unless skip_sql? encoding = @config[:encoding] execute("SET NAMES '#{encoding}'", :skip_logging) if encoding execute("SET SQL_AUTO_IS_NULL=0", :skip_logging) end end end
Если configure_connection не работает, я попробую метод подключения следующим образом:
class ActiveRecord::ConnectionAdapters::MysqlAdapter alias :old_connect :connect def connect old_connect unless skip_sql? end alias :old_active? :active? def active? skip_sql? ? false : old_active? end end
Я полагаю, что метод connect вызван до того, как настроить метод подключения, поэтому он должен помочь с проблемой сокета.