gpt4 book ai didi

ruby-on-rails - 是否可以在 Ruby 1.9 中透明地实现 ActiveRecord 查询的 Future 模式?

转载 作者:行者123 更新时间:2023-12-01 05:27:55 25 4
gpt4 key购买 nike

我正在一个现有的 Rails 2 站点上工作,该站点具有最近更新到 Ruby 1.9.2 和 mysql2 gem 的大型代码库。我注意到这个设置允许非阻塞的数据库查询;你可以做client.query(sql, :async => true)然后再调用client.async_result ,它会阻塞直到查询完成。

在我看来,我们可以通过拥有所有 ActiveRecord 来提高性能。返回集合的查询拒绝阻塞,直到对集合调用方法。例如

@widgets = Widget.find(:all, :conditions=> conditions) #sends the query
do_some_stuff_that_doesn't_require_widgets
@widgets.each do #if the query hasn't completed yet, wait until it does, then populate @widgets with the result. Iterate through @widgets
...

这可以通过猴子补丁 Base::find 来完成。及其相关方法来创建一个新的数据库客户端,异步发送查询,然后立即返回一个 Delegator 或其他代理对象,当对其调用任何方法时,调用 client.async_result , 使用 ActiveRecord 实例化结果,并将方法委托(delegate)给它。 ActiveRecord关联代理对象已经以类似的方式实现 ORM。

但是,我找不到任何这样做的人,而且在任何版本的 Rails 中似乎都不是一个选项。我已经尝试自己实现它并且它在控制台中工作(只要我将 ; 1 附加到调用所有内容的行中,以便 to_s 不会在结果中被调用)。但它似乎与其他各种魔法发生碰撞并产生各种问题。

那么,出于某种我没有想到的原因,这是一个坏主意吗?如果不是,为什么不是这样 ActiveRecord已经工作了吗?有没有一种干净的方法来实现它?

最佳答案

我怀疑 .async_result 方法不适用于所有数据库驱动程序;如果没有,它就不能合并到通用的 ActiveRecord 调用中。

在循环大型记录集时提高性能的一种更便携的方法是使用 find_each 或 find_in_batches。我认为它们可以在 rails 2.3 和 rails 3.x 中工作。 http://guides.rubyonrails.org/active_record_querying.html#retrieving-multiple-objects-in-batches

关于ruby-on-rails - 是否可以在 Ruby 1.9 中透明地实现 ActiveRecord 查询的 Future 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12900121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com