在Rails中使用存储过程

正如我在上一篇文章中所说,我们的Rails应用程序必须与我们从中提取数据的第三方应用程序中的EAV类型的表进行交互。 我创建了一个View以使数据正常,但运行时间过长。 我们有一位离岸PHP开发人员创建了一个存储过程来帮助加快速度。

现在我们遇到了我们需要从Rails应用程序调用此存储过程的问题,以及提供搜索和过滤。 视图可以这样做,因为Rails将其视为传统的Rails模型。 我怎么能用存储过程做到这一点? 我们需要编写自定义搜索和排序(我们使用的是Searchlogic)吗? 管理层无法理解使用Rails存储过程的缺点; 他们所说的是当前的方法加载数据需要很长时间并且需要修复,但搜索和过滤是关键function。

编辑我在这里发布了这个查询的代码: 优化一个奇怪的MySQL查询 。 有趣的是,当我在GUI(Navicat)中运行此查询时,它运行大约5秒钟,但在网页上运行需要一分钟; 由于我在原帖中概述的原因,视图很复杂,但我认为MySQL会优化和缓存像SQL Server这样的视图(或者更确切地说,我是如何阅读SQL Server的),以提高性能。

您可以从Rails调用存储过程,但是您将失去ActiveRecord的大部分好处,因为标准生成的SQL将无法工作。 您可以使用本机数据库连接并调用它,但它将是一个漏洞的抽象。 您可能需要考虑DataMapper。

回顾上一个问题,我会让DBA创建一个触发器,从数据中创建一个更多的关系结构。 触发器会将EVA数据插入表中,这是我知道在MySQL中实现物化视图的唯一方法。 这样,您只需在插入时支付少量增量后台成本,并且应用程序可以正常运行。

无论如何…

ActiveRecord::Base.connection.execute("call SP_name (#{param1}, #{param2}, ... )") 

但是在灯塔上有一张开放的票据,表明这种方法可能无法改变一些参数来使用连接。