Единственный способ обойти это - переопределить функцию 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
Я считаю, что метод подключениявызывается перед настройкой метода подключения, поэтому это должно помочь с проблемой сокета.