2015-09-15 1 views
1

У меня есть запрос ActiveRecord user.loans, и я использую user.loans.map(&:dup) для дублирования результата. Это так, что я могу выполнить цикл через каждые Loan (100 + раз) и выполнить несколько расчетов..map (&: dup) Расчеты Slow

Эти вычисления занимают несколько секунд по сравнению с тем, когда я запускаю их непосредственно на user.loans или user.loans.dup. Если я это сделаю, все запросы user.loans будут затронуты даже при запросе различными способами.

Есть ли альтернатива .map(&:dup), которая может достичь того же результата при более быстрых вычислениях? Я хотел бы сохранить отношения, чтобы я мог получать связанные записи к каждому Loan.

+1

Возможно, вам следует делать вычисления в SQL? Можете ли вы привести пример расчетов, которые вы делаете? –

ответ

0

Для разрешения конфликтов с другими вызовами user.loans, я завелся с помощью user.loans.reload в Presenter у меня есть для этого конкретного вида. Таким образом, я смог продолжить расчеты непосредственно на Активной записи в другом месте (по предложению Даниэля Баталлы), но без конфликтов, о которых я упоминал в своем первоначальном вопросе.

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.

Пожалуйста, дайте мне знать, если это улучшить производительность :)

+0

Эй, Даниэль, ActiveRecord - это, безусловно, путь, но он не решает проблему, упомянутую во втором абзаце моего вопроса. Чтобы использовать ActiveRecord и манипулировать объектами ссуды, не затрагивая другие данные по кредитам, я закончил использование '.reload' при звонках на кредиты за пределами расчетов. –