Rails - как мне сделать запрос, который вообще не попадает в базу данных?
Чтобы отследить некоторые проблемы с производительностью, я пытаюсь создать страницу, которая визуализируется с помощью инфраструктуры Rails (2.3.8), но не делает никаких обращений к базе данных.
Я хочу, чтобы запрос проходил через типичное промежуточное программное обеспечение (rout.rb > controller > view), в отличие от рендеринга простой статической страницы (например, 404.html), и в нем должно работать, когда сервер db выключен (веб-сервер). Все еще работает). Фактически отображаемая страница представляет собой простую HTML-страницу, отображающую время валюты с использованием erb. Прямо сейчас я получаю сообщение об ошибке при выключении базы данных, и я вижу 2 запроса, которые все еще сделаны:
SQL (0.1ms) SET NAMES 'utf8'
SQL (0.1ms) SET SQL_AUTO_IS_NULL=0
Любая идея, как полностью переопределить БД при выполнении этого запроса? Благодарю.
1 ответ
Единственный способ обойти это - переопределить функцию configure_connection в ActiveRecord. Для этого я бы порекомендовал сделать функцию ApplicationController с именем skip_sql? чтобы проверить, хотите ли вы пропустить функцию configure_connection для некоторых комбинаций контроллера #action:
класс ApplicationController def skip_sql? params[:controller] == "..." && params[:action] == "..." конец конец
Затем сделайте эту функцию доступной для ваших классов и моделей:
модуль SkipSql Контроллер модуля def self.included(base) base.prepend_before_filter:assign_skip_sql_to_models конец def assign_skip_sql_to_models ActiveRecord::Base.skip_sql_proc = proc {send(:skip_sql?)} конец конец Модель модуля def self.included(base) base.extend ClassMethods конец модуль ClassMethods attr_accessor:skip_sql_proc def skip_sql? ActiveRecord::Base.skip_sql_proc.call, если ActiveRecord:: Base.skip_sql_proc конец конец def skip_sql? self.class.skip_sql? конец конец конец Object.send:include, SkipSql::Model::ClassMethods ActionController::Base.class_eval {include SkipSql::Controller}
Тогда пропускайте sql только на установленных вами комбинациях контроллера #action:
класс ActiveRecord::ConnectionAdapters::MysqlAdapter def configure_connection разве skip_sql? encoding = @config[:encoding] выполнить ("SET NAMES '#{encoding}'",:skip_logging), если кодирование выполнить ("SET SQL_AUTO_IS_NULL=0",:skip_logging) конец конец конец
Если configure_connection one не работает, я бы попробовал метод connect следующим образом:
класс ActiveRecord:: ConnectionAdapters:: MysqlAdapter псевдоним: old_connect: connect Def Connect old_connect разве skip_sql? конец псевдоним:old_active?: Активный? дефи активен? skip_sql?? false: old_active? конец конец
Я считаю, что метод connect вызывается до того, как будет настроен метод connect, поэтому он должен помочь с проблемой сокета.