【问题标题】:Rails - Large database queriesRails - 大型数据库查询
【发布时间】:2015-12-17 07:23:59
【问题描述】:

假设我需要为产品目录数据库实现搜索算法。这将包括跨产品表、制造商表、库存表等的多个连接。

在 .NET / MSSQL 中,我会将此类逻辑隔离在 DB 存储过程中,然后在我的 .NET 应用程序的数据访问层中编写一个包装器方法来简单地调用此存储过程。

这样的事情在 RoR 中是如何工作的?根据我的基本理解,RoR 默认使用它的 ORM。这是否意味着,我必须将我的搜索逻辑移动到应用程序层,并使用它的 ORM 编写它? SQL存储过程非常密集......为了性能,它需要在存​​储过程中。

这在 RoR 中是如何工作的?

编辑:从前两个响应中,我推测 ActiveRecord 是在 Ruby 中做事的方式。这是否意味着可以(应该)使用 ActiveRecord 类重写需要具有大量连接、过滤甚至动态 SQL 的大型复杂查询的应用程序?

谢谢!

【问题讨论】:

    标签: ruby-on-rails .net ruby database postgresql


    【解决方案1】:

    虽然可以在 Rails 中运行原始 SQL 语句,但在 connection 对象上使用 execute 方法,这样做将失去 ActiveRecord 的所有好处。如果你仍然想走这条路,你可以这样使用它:

    ActiveRecord::Base.connection.execute("call stored_procedure_name")
    

    探索的另一个选项可能是创建一个“查询对象”来封装您的查询逻辑。在内部,您仍然可以使用 ActiveRecord 查询方法。 ActiveRecord 在优化您的 SQL 查询方面已经相当熟练,您仍然可以进行一些手动调整。

    下面是这样一个对象的简单脚手架:

    # app/queries/search_products.rb
    
    class SearchProducts
      def initialize(params)
        @search = search
      end
    
      def call
        Product.where(...) # Plus additional search logic
      end
    end
    

    第三种选择是使用elasticsearch-railssunspot 之类的东西。这将需要一些额外的设置时间并增加复杂性,但如果您的搜索要求发生变化,可能会获得回报。

    【讨论】:

    • 谢谢@Drenmi。那么如果 ActiveRecord 是实现这一点的方法,那么开发人员如何在 Rails 中实现疯狂的大型复杂搜索算法呢?这一切都是通过 ActiveRecord 类完成的吗?
    • 根据我的经验,对于大型和复杂的搜索,大多数开发人员使用第三方服务或 gem。自己滚动有很多陷阱。即使在 Postgres 中获取不区分大小写的索引也可能有点令人困惑。我忘了在我的回答中提到一个名为 Sunspot 的宝石,但我已经在编辑中添加了它。您可以查看它是否符合您的需求。
    【解决方案2】:

    存储过程是使应用程序有时更快的方法之一,但它需要高昂的成本和时间来为开发人员调试代码。 Rails 使用的是ActiveRecord ORM,所以如果你想使用存储过程会导致主函数 ActiveRecord 不好用。

    有一些关于rails的解释 stored-procedures-in-ruby-on-railsusing stored procedure

    【讨论】:

    • 谢谢。同样的问题...对于涉及许多连接(包括动态 SQL)的大型/复杂查询,您推荐的方法是什么?通常会使用 ActiveRecord 重构为一系列合适的命令吗?
    • 好的,我将分享我在遇到复杂查询时所做的事情。基本上,Rails 包括使用find_by_sql 执行 sql 查询,因此您只需复制您的 sql 并将其放入此方法中。不把我的sql代码改成ActiveRecord风格对我很有帮助。这就是 find_by_sql 如何执行 SQL 语法apidock.com/rails/ActiveRecord/Base/find_by_sql/class
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多