gpt4 book ai didi

ruby-on-rails - [] :Array 的未定义方法 `find_each'

转载 作者:行者123 更新时间:2023-12-02 21:26:30 25 4
gpt4 key购买 nike

我有类似这样的代码。

@deliveries = User.find_uniq_deliveries(...)
.
.
.
(many conditions added using 'named_scope' )
@deliveries.sort do |a,b|
.
.
end

主要问题是,这会获取大量结果并导致 Oracle 出现异常,即“in”语句中不允许使用超过 1000 个元素。所以我尝试使用find_each来批量获取

deliveries_list = [] 
@deliveries.find_each(:batch_size=999) do |delivery|
deliveries_list.push(delivery)
end
@deliveries = deliveries_list

但这给出了异常(exception)

undefined method `find_each' for []:Array

正如你所看到的,我对rails很陌生(来自java),并且rails对我来说完全没有意义。我该怎么做才能防止 Oracle SQL 错误但获取数据

编辑:

  def find_uniq_deliveries(category,date,view)
dels = []
sent_deliveries.send("for_#{category}s").send("with_#{category}_status", view).for_date_range(date).collect(&:workflow_item).uniq.each do |m|
dels << m.deliveries.first unless m.deliveries.empty?
end
dels.compact
end

最佳答案

必须对 Active Record 查询结果调用 find_each。

您将从 find_uniq_deliveries 返回一个数组,因此不支持 find_each。

您需要重写查询,将 find_each 调用放在 .collect(&:workflow_item) 之前。

另请参阅 Active Record 查询接口(interface)以了解可链接的方法:

http://guides.rubyonrails.org/active_record_querying.html

.collect 方法将生成一个值数组,因此您不能在其后放置 find_each。

编辑:这是一个如何重构代码以使用 find_each 的快速示例

基本配方是:

  1. 在调用任何非查询方法(例如收集)之前构建 Active Record 查询。

  2. 作为该查询的一部分,您将使用 find_each 迭代结果集,从而从数据库中动态获取批量结果。

  3. 将非 Active Record 调用(例如对方付费)保存到最后。您可以返回结果数组,但要知道您将无法使用此数组调用任何其他 AR 方法,例如命名范围。

下面是一个使用 find_each 并接受查询的 find_uniq_deliveries 示例:

 def find_uniq_deliveries(query,category,date,view)
dels = []
query.send("for_#{category}s").send("with_#{category}_status", view).for_date_range(date).find_each do |delivery|
# do something with your delivery object and save result
result = process_delivery(delivery)
dels << result
end
dels.compact
end

您可以使用任何交付查询来调用它,如下所示:

query = Delivery.some_named_scope.some_other_scope
find_uniq_deliveries(query,category,date,view)

关于ruby-on-rails - [] :Array 的未定义方法 `find_each',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23829655/

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