.map(&:dup)计算速度慢

时间:2015-09-15 00:29:40

标签: ruby-on-rails arrays ruby performance ruby-on-rails-4

我有一个ActiveRecord查询user.loans,并使用user.loans.map(&:dup)复制结果。这样我就可以遍历每个Loan(100次以上)并进行多次计算。

与直接在user.loansuser.loans.dup上运行相比,这些计算需要几秒钟的时间。但是,如果我执行此操作,即使使用不同的方法查询,所有查询user.loans都会受到影响。

是否有替代.map(&:dup)可以通过更快的计算获得相同的结果?我想保留关系,以便我可以检索每个Loan的相关记录。

2 个答案:

答案 0 :(得分:1)

您可以通过ActiveRecord直接进行计算,这是您实现所需目标的最快方法,这样您就不必遍历生成的数组。

如果您仍想循环遍历Array元素,可能不应使用map复制每个Array元素。您可以使用each代替which does not affect original Array element。以下是我认为你应该做的事情:

def calculate_loans
  calculated_loans = Array.new    
  user.loans.each do |loan|
    # Here you make your calculations. For example:
    calculated_loans.push(loan.value += 10)
  end
  calculated_loans
end

这样,您将拥有原始user.loans元素和带有calculated_loans的重复数组。

请告诉我这是否会改善您的表现:)

答案 1 :(得分:0)

要解决与user.loans的其他来电之间的冲突,我使用user.loans.reload中的Presenter查看此特定视图。这样我就可以继续在其他地方的Active Record上进行计算(根据Daniel Batalla的建议),但没有我在原始问题中提到的冲突。