【问题标题】:Rails - Simplifying calculation models & objectsRails - 简化计算模型和对象
【发布时间】:2012-07-03 12:11:31
【问题描述】:

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 我已将 Railsdog 的 cmets 标记为答案,因为它有助于达到正确的水平,我将提出一个单独的问题,关于允许操作使用实际操作数或先前操作的结果。

标签: ruby-on-rails database ruby-on-rails-3 ruby-on-rails-3.1 model


【解决方案1】:

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

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

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

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

【讨论】:

  • 如果我理解你所说的正确,我可以将操作模型修改为简单地具有left_operand和right_operand,并且任何给定的操作数都可以是先前操作的值?这似乎是明智的,尽管它可能会导致大量的操作数(即,如果我需要将 10 种不同的销售类型加在一起,我将需要很多操作数)。我很想看看是否有人可以帮助将这种结构转换为类似 Rails 的结构(特别是在如何将操作数引用到先前计算的结果方面)。
  • 是的,确实会产生大量的操作数,但是操作数的定义是可以重用的。我们处理的问题之一是测试新想法的公式的“摇摆不定”(这是真正的客户术语 - 总是让我发笑)。当我们设计该应用程序时,他们希望复杂设置的高度可重用性,因此他们能够命名封装一组工作的某些子计算。你可以做类似的。您只需要定义一次特定的聚合指标,然后在需要的地方重复使用该指标。按经销商、按地区等。
猜你喜欢
  • 1970-01-01
  • 2012-09-26
  • 2012-01-07
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 2021-06-14
相关资源
最近更新 更多