Как я уже говорил в предыдущем посте, наше приложение Rails должно взаимодействовать с таблицей типов E-A-V в стороннем приложении, из которого мы извлекаем данные. Я создал представление, чтобы сделать данные нормальными, но он слишком долго работает. У нас был один из наших оффшорных разработчиков PHP, который создал хранимую процедуру, чтобы ускорить ее.
Теперь мы сталкиваемся с проблемой, которую нам нужно вызвать эту хранимую процедуру из приложения Rails, а также обеспечить поиск и фильтрацию. Представление может сделать это, потому что Rails рассматривал его как традиционную модель Rails. Как я могу сделать это с помощью хранимой процедуры? Нужно ли нам писать пользовательский поиск и заказ (мы использовали Searchlogic)? Руководство неспособно понять недостатки использования хранимой процедуры от Rails; все они говорят, что текущий метод слишком долго загружает данные и нуждается в исправлении, но поиск и фильтрация являются критическими функциями.
EDIT Я разместил здесь код для этого запроса: Оптимизация странного MySQL-запроса. Смешно, что когда я запускаю этот запрос в графическом интерфейсе (Navicat), он запускается примерно через 5 секунд, но на веб-странице требуется более минуты; представление сложное по причинам, изложенным в исходном сообщении, но я бы подумал, что MySQL оптимизирует и кэширует такие представления, как SQL Server (или, вернее, как я читаю этот SQL Server), для повышения производительности.
Вы можете вызывать хранимые процедуры из Rails, но вы потеряете большинство преимуществ ActiveRecord, поскольку стандартный сгенерированный SQL не будет работать. Вы можете использовать собственное подключение к базе данных и называть его, но это будет непроходимая абстракция. Возможно, вы захотите рассмотреть DataMapper.
Оглядываясь на ваш последний вопрос, я бы попросил администратор базы данных создать триггер для создания более реляционной структуры из данных. Триггер будет вставлять данные EVA в таблицу, и это единственный способ реализовать материализованные представления в MySQL. Таким образом, вы платите только небольшую инкрементную стоимость фона для вставки, и приложение может работать нормально.
В любом случае...
ActiveRecord::Base.connection.execute("call SP_name (#{param1}, #{param2}, ... )")
Но там открыть билет на маяке, указав этот подход, возможно, не сработает с изменением некоторых параметров для использования соединения.