我有一个ActiveRecord查询user.loans
,并使用user.loans.map(&:dup)
复制结果。这样我就可以遍历每个Loan
(100次以上)并进行多次计算。
与直接在user.loans
或user.loans.dup
上运行相比,这些计算需要几秒钟的时间。但是,如果我执行此操作,即使使用不同的方法查询,所有查询user.loans
都会受到影响。
是否有替代.map(&:dup)
可以通过更快的计算获得相同的结果?我想保留关系,以便我可以检索每个Loan
的相关记录。
答案 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的建议),但没有我在原始问题中提到的冲突。