2013-04-25 68 views
0

我有一个应用程序,我收到&从多个来源获取每日销售报告。所有的结构都是不同的,所以我将它们存储在我的Postgres数据库中的单独表中。这是生成销售报告/分析的有效方式吗?

我目前正在做这样的事情来迭代过去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

移动代码到一个方法也可以让你更快的更新,可以说,我希望用户能够控制记录如何追溯到检索:

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 2013-04-25 12:37:25