假设我需要为产品目录数据库实现搜索算法。这将包括跨产品表、制造商表、库存表等的多个连接。
在 .NET/MSSQL 中,我会将此类逻辑隔离在数据库存储过程中,然后在我的 .NET 应用程序的数据访问层中编写一个包装器方法来简单地调用此存储过程。
这样的事情在 RoR 中如何运作?根据我的基本理解,RoR 默认使用它的 ORM。这是否意味着,我必须将我的搜索逻辑移动到应用层,并使用它的 ORM 编写它? SQL 存储过程非常激烈......为了性能,它需要在存储过程中。
这在 RoR 中如何运作?
编辑:从前两个回复中,我了解到 ActiveRecord 是在 Ruby 中做事的方式。这是否意味着可以(应该)使用 ActiveRecord 类重写需要大量连接、过滤甚至动态 SQL 的大型复杂查询的应用程序?
谢谢!
最佳答案
虽然可以在 Rails 中运行原始 SQL 语句,但使用 execute connection
对象上的方法,这样做你将失去 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-rails 的东西或 sunspot .这将需要一些额外的设置时间并增加复杂性,但如果您的搜索要求发生变化,最终可能会有所返回。
关于ruby-on-rails - Rails - 大型数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32680908/