2013-04-25 2 views
0

У меня есть приложение, в котором я получаю & ежедневные отчеты о продажах из разных источников. Все структурированы по-разному, поэтому я храню данные в своих Postgres db в отдельных таблицах.Является ли это эффективным способом создания отчетов/аналитики продаж?

В настоящее время я делаю что-то подобное, чтобы перебирать за последние 30 дней продажи одного источника, и, похоже, он работает очень хорошо. Моя забота заключается в том, насколько эффективна масштабируемость &, когда я добавлю дополнительные источники отчетов так, как это было у меня в настоящее время, это означает, что мне придется добавлять и повторять большие объемы кода для каждого нового источника.

<% from = Date.today - 30 %> #30 days ago 
<% to = Date.today %> #Today 
<% step_date = from %> 

<% source_one_chart_data = [] %> #Initialise empty array to later pass to JS Chart library 

<% begin %> 
    <% count = @product.sales_source_one.total.where(:report_date => step_date).count %> #check if there are any sales for this product on the current step date 
     <% if count != 0 %> 
      <% sale = @product.sum_total_net_by_day(step_date) %> 
      <% source_one_chart_data.push(sale.to_s) %> #Push sales total to array if sales exist on that date 
     <% else %> 
      <% source_one_chart_data.push("0") %> #Otherwise push a zero into array so all 30 days map to a value 
     <% end %> 

    <% step_date += 1.day %> #Increase step_date by 1 on each iteration of the loop 
<% end while step_date <= to %> #Stop loop when we reach to date 

Может ли кто-нибудь предложить какие-либо рекомендации по эффективному привлечению дополнительных источников сбыта без повторения кода? Кроме того, было бы хорошо, если бы я мог изменить шаг от дня к неделе/​​месяцу/году и вычислить его соответственно; поэтому, если источник продаж сообщается ежедневно, а шаг - неделя, он будет суммировать все значения, которые происходят на шаговой неделе.

ответ

0

Почему у вас есть весь этот код на ваш взгляд? Вы должны переместить большую часть его в свою модель/контроллер.

def process_chart_data 
    from = 1.month.ago.to_date 
    to = Date.today 
    step_date = from 
    chart_data = [] 

    while step_date <= to 
    sales_total = sales_source_one.total.where(report_date: step_date).count 
    if sales_total.zero? 
     chart_data.push(0) 
    else 
     sale = sum_total_net_by_day(step_date) 
     chart_data.push(sale.to_s) 
    end 
    step_date += 1 
    end 

    return chart_data 
end 

выше, вероятно, может быть переработан дальше, но теперь, если вы поместите его в Product модели, то в вашем контроллере вы можете просто сделать:

@product = Product.find(params[:id]) # or whatever 
@chart_data = @product.process_chart_data 

Затем на ваш взгляд, вы можете использовать @chart_data.

Moving этот код в метод также позволяет обновлять его быстрее, позволяет сказать, что я хочу пользователю контролировать, как далеко записи извлекаются:

def process_chart_data(start_date) 
    from = start_date 
    ... 
end 

В контроллере:

@product = Product.find(params[:id]) 
@chart_data = @product.process_chart_data(params[:start_date]) 
+0

Ах, я склоняюсь к тому, чтобы начать с того, чтобы начать с него, а затем снова вернуться к модели/контроллеру, как только у меня получится поток. Ваш ответ велик, но это определенно поможет много! благодаря – Raoot

Смежные вопросы