代码之家  ›  专栏  ›  技术社区  ›  Wayne Molina

在Rails中使用存储过程

  •  8
  • Wayne Molina  · 技术社区  · 15 年前

    正如我在前一篇文章中所说,我们的Rails应用程序必须在第三方应用程序中与E-A-V类型的表进行接口,我们从中提取数据。我创建了一个视图来使数据正常,但是运行时间太长了。我们的一个离岸PHP开发人员创建了一个存储过程来帮助加快速度。

    现在我们遇到了一个问题,我们需要从Rails应用程序调用这个存储过程,并提供搜索和过滤。视图可以做到这一点,因为Rails将其视为传统的Rails模型。如何对存储过程执行此操作?我们是否需要编写自定义搜索和排序(我们使用的是SearchLogic)?管理层无法理解使用Rails中的存储过程的缺点;他们只说当前方法加载数据花费的时间太长,需要修复,但搜索和过滤是关键功能。

    编辑 我在这里发布了此查询的代码: Optimizing a strange MySQL Query . 有趣的是,当我在一个GUI(navicat)中运行这个查询时,它会在5秒钟内运行,但在网页上运行需要一分钟多的时间;由于我在原始文章中概述的原因,视图很复杂,但我认为MySQL会像SQL Server那样优化和缓存视图(或者更确切地说,我是如何读取SQL Server),以提高性能。嗯。

    1 回复  |  直到 15 年前
        1
  •  5
  •   MattMcKnight    15 年前

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

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

    总之…

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

    但是有一个 open ticket out there on lighthouse 指出这种方法可能不适用于更改某些参数以使用连接。