2

我最近问了一些关于这个的问题,我正在到达我需要去的地方,但在我的最后一个问题中可能不够具体,无法一直到达那里。因此,我正在尝试建立一个结构来计算基于应用程序数据的一些指标,它应该是灵活的,以允许轻松(安全地)添加其他指标,并且在我的视图中使用起来也相对简单。

总体目标是我将能够拥有一个自定义助手,在我看来,它允许以下内容:

calculate_metric(@metrics.where(:name => 'profit'),@customer,@start_date,@end_date)

这应该是不言自明的 - 该名称可以替换为任何可用的度量名称,并且可以在任何给定时间段内为任何客户或客户组执行计算。

出现复杂性的地方在于如何存储计算指标的公式 - 我在下面展示了我为此而汇总的当前结构:

在此处输入图像描述

您会注意到关键模型是度量、操作、操作类型和操作数。当公式非常简单时,这种结构可以正常工作,比如利润 - 一个只有两个操作数,@customer.sales.selling_price.sum并且@customer.sales.cost_price.sum,只有一个类型的减法运算。由于我们不需要存储任何中间值,register_targetwill be1return_register.

我认为我不需要写一个完整的例子来说明它在哪里变得更复杂,但我只想说我是否想计算在两个日期之间开户的客户拥有电子邮件地址的客户百分比(但不一定购买),这将变得更加复杂,因为辅助函数需要知道如何处理日期变化。

因此,这种结构似乎过于复杂,除了一个简单的公式之外很难用于任何其他东西——任何人都可以提出解决这个问题的更好方法吗?

编辑:根据 Railsdog 的回答,我对我的模型做了一些细微的改动,并重新上传了图表以清楚起见。本质上,我确保了reporting_category 模型可以用来对用户隐藏中间操作数,并且可以在用户计算中使用的操作数可以以分类格式呈现。我现在需要的只是有人帮助我修改我的结构,以允许操作以 rails-esqe 方式使用实际操作数或先前操作的结果。

感谢您迄今为止的所有帮助!

4

1 回答 1

3

OY合租。自从我做了类似于你正在尝试的事情以来,已经有好几年了(比如 15 年)。我的应用程序用于模拟工业焚化炉的颗粒沉积率。

最后,所有计算都归结为两个操作数和一个运算符(操作顺序、括号等)。操作数要么是常量、db 值,要么是另一个计算的结果(指向另一个计算的指针)。任何操作数(通过模型方法)都可以评估自己,无论该值是内在的,还是需要子计算首先评估自己。

界面不是特别优雅(我认为这是真正的挑战),但用户是科学家,他们理解计算分解。

考虑到您的问题,我会让任何单独的 Metric 能够返回它的值,并创建必要的方法来得出该答案。毕竟,单个度量只需要知道如何使用指示的运算符组合它的两个操作数。如果一个操作数本身就是一个度量,你只需问它它的价值是什么。

于 2012-07-03T12:55:28.930 回答