我有一个ActiveRecord查询user.loans,并且正在使用user.loans.map(&:dup)复制结果。这样我就可以循环遍历每个Loan (100+时间)并运行几个计算。
与直接在user.loans或user.loans.dup上运行它们相比,这些计算耗时数秒。但是,如果我这样做,所有查询user.loans都会受到影响,即使在使用不同方法进行查询时也是如此。
是否有一种替代.map(&:dup)的方法,可以通过更快的计算实现同样的结果?我希望保存这些关系,以便能够检索到每个Loan的相关记录。
发布于 2015-09-15 03:07:46
为了解决与其他对user.loans的调用之间的冲突,我在针对这个特定视图的Presenter中使用了user.loans.reload。通过这种方式,我能够继续在其他地方直接进行计算(根据丹尼尔·巴塔拉的建议),但没有我在最初的问题中提到的冲突。
发布于 2015-09-15 02:14:51
实现所需的最快方法是直接在ActiveRecord上进行计算,这样您就不必遍历生成的数组。
如果仍然希望遍历数组元素,则可能不应该使用map复制每个数组元素。你可以用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的复制数组。
请告诉我这是否提高了你的表现:)
https://stackoverflow.com/questions/32575860
复制相似问题