我最近就这个问题问了几个问题,我现在要走到哪里去,但在我最后的问题中,也许还不够具体,无法做到这一点。因此,我试图构建一种基于应用程序数据计算某些度量的结构,这种结构应该是灵活的,以便更容易地(并且安全地)添加额外的度量,并且在我的视图中使用也相对简单。
总体目标是,我将能够拥有一个自定义助手,它允许在我看来类似于以下内容:
calculate_metric(@metrics.where(:name => 'profit'),@customer,@start_date,@end_date)这应该是相当不言自明的--名称可以被替换为任何可用的度量名称,并且可以在任何给定的时间段内为任何客户或客户组执行计算。
产生复杂性的地方在于如何存储计算度量的公式--我已经在当前的结构中展示了我为这样做而建立起来的结构:

您将注意到,关键模型是度量、操作、operation_type和操作数。当公式非常简单时,这种结构可以工作,比如利润--一个只有两个操作数,@customer.sales.selling_price.sum和@customer.sales.cost_price.sum,只有一个类型的减法运算。因为我们不需要存储任何中间值,所以register_target将是1,return_register也是。
我不认为我需要写出一个完整的示例来说明它在哪里变得更加复杂,但如果我想要计算在两个日期之间开设帐户(但不一定购买)的客户的电子邮件地址的百分比,这将变得更加复杂,因为助手函数将需要知道如何处理日期变化。
因此,这种结构似乎过于复杂,除了一个简单的公式之外,其他任何东西都很难使用--有人能提出更好的解决这个问题的方法吗?
编辑:根据来自铁路狗的答案,我对我的模型做了一些轻微的修改,并重新上传了图表以保持清晰。从本质上说,我已经确保了reporting_category模型可以用于向用户隐藏中间操作数,并且可以以分类格式表示用户计算中可能使用的操作数。现在,我所需要的就是有人帮助我修改我的结构,允许一个操作以rails-esqe的方式使用实际操作数或以前操作的结果。
到目前为止,感谢您的帮助!
发布于 2012-07-03 12:55:28
奥维。自从我做了一些与你所尝试的类似的事情以来,我已经有很多年了(比如15年)。我的应用程序被用来模拟工业焚烧炉的微粒沉积速率。
最后,所有的计算都归结为两个操作数和一个运算符(操作顺序、括号等)。操作数要么是常量、db值,要么是另一个计算的结果(指向另一个计算的指针)。任何操作数(通过模型方法)都可以评估自身,无论该值是内在的,还是需要一个子计算才能首先评估自己。
界面并不特别优雅(我认为这才是真正的挑战),但用户是科学家,他们理解计算分解。
考虑到你的问题,我会让任何一个度量能够返回它的价值,并创造出必要的方法来得出这个答案。毕竟,一个度量只需要知道如何使用指定的运算符组合它的两个操作数。如果一个操作数本身就是一个度量,您只需问它它的值是什么。
https://stackoverflow.com/questions/11310639
复制相似问题