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

任何人都可以就如何有效地引入额外的销售来源而无需重复代码提供任何指导吗?此外,如果我可以将步骤从日更改为周/月/年并让它相应地计算销售额,那就太好了;因此,如果每天报告销售来源并且步骤是周,它将汇总步骤周中出现的所有值。

4

1 回答 1

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])
于 2013-04-25T11:58:25.153 回答