这是生成销售报告/分析的有效方式吗?

时间:2013-04-25 11:17:17

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个应用程序,我收到&从多个来源获取每日销售报告。所有结构都不同,所以我在单独的表中存储到我的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

任何人都可以提供有关如何有效引入其他销售来源而无需重复代码的任何指导吗?此外,如果我可以将步骤从一天改为一周/一个月/一年并且相应地计算销售额,那将是一件好事。因此,如果每天报告销售来源并且步骤为星期,则将汇总步骤周中出现的所有值。

1 个答案:

答案 0 :(得分: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])