我最近问了几个关于这个问题的问题,而且我已经到了我需要去的地方,但在我上一期的问题中可能还不够具体,无法一直到达那里。因此,我正在尝试整合一个基于应用数据计算某些指标的结构,这应该是灵活的,以便允许轻松(和安全)添加其他指标,并且在我的视图中使用也相对简单。
总体目标是,我将能够拥有一个自定义助手,在我的视图中允许以下内容:
calculate_metric(@metrics.where(:name => 'profit'),@customer,@start_date,@end_date)
这应该是相当自我解释的 - 名称可以替换为任何可用的度量标准名称,并且可以在任何给定的时间段内为任何客户或客户组执行计算。
复杂性的出现在于如何存储用于计算度量的公式 - 我已经在下面显示了我为此做出的当前结构:
您将注意到关键模型是metric,operation,operation_type和operand。当公式非常简单时,这种结构可以正常工作,例如利润 - 一个只有两个操作数,@customer.sales.selling_price.sum
和@customer.sales.cost_price.sum
,只有一个类型减法操作。由于我们不需要存储任何中间值,register_target
将1
,return_register
也是如此。
我认为我不需要写出一个完整的例子来说明它变得更复杂,但是如果我想计算在两个日期之间开设账户的客户使用电子邮件地址的客户百分比(但是不一定要购买),这将变得更加复杂,因为帮助函数需要知道如何处理日期变化。
因此,似乎这种结构过于复杂,并且除了简单的公式之外很难用于任何其他任何东西 - 有人能提出更好的方法来解决这个问题吗?
编辑:根据Railsdog的回答,我对我的模型进行了一些细微的修改,并为了清晰起见重新上传了图表。本质上,我已经确保reporting_category模型可以用于隐藏用户的中间操作数,并且可以以分类格式呈现可以在用户计算中使用的操作数。我现在需要的是帮助我修改我的结构以允许操作使用 实际操作数或以前面的操作方式使用rails-esqe方式。感谢您迄今为止的所有帮助!
答案 0 :(得分:3)
最后,所有的计算都归结为两个操作数和一个操作符(操作顺序,括号等)。操作数是常量,db值或另一个计算的结果(指向另一个计算的指针)。任何操作数(通过模型方法)都可以评估自己,无论该值是内在的,还是需要子计算来首先评估自己。
界面并不是特别优雅(这是我认为的真正挑战),但用户是科学家,他们理解计算分解。
考虑到您的问题,我可以让任何单个指标能够返回它的价值,并创建必要的方法来得出答案。毕竟,单个度量只需要知道如何使用指示的运算符组合它的两个操作数。如果操作数本身就是一个指标,那么你只需询问它的价值是什么。