【问题标题】:Rails object structure for reporting metrics用于报告指标的 Rails 对象结构
【发布时间】:2012-07-02 21:18:38
【问题描述】:

我最近就这个主题提出了几个问题,我想我正在设法缩小我需要做的事情。

我正在尝试在 Rails 应用程序中创建一些“指标”(引用是因为这些指标不应与与应用程序性能相关的指标混淆;这些指标是基于应用程序数据生成的);在我看来,基本上我希望能够使用类似于以下内容的东西:

@metric(@customer,'total_profit','01-01-2011','31-12-2011').result

这将给出给定客户 2011 年的总利润。

当然,我可以使用自定义 result 方法创建指标模型,但我对创建自定义指标(例如,total_profit、total_revenue 等)的最佳方式感到困惑:它们很容易扩展,因此可以在每个用户的基础上添加自定义指标。

我最初的想法是尝试将每个自定义指标的公式存储在具有 operandoperationoperation_type 模型的结构中,但这很快就变得非常混乱和冗长,并且被证明很难做到在添加每个指标方面。

我现在的想法是,也许我可以创建一个自定义指标帮助器方法来保存我的每个指标(因此我可以对每个指标进行硬编码,并将变量传递给每个方法),但它的可扩展性如何?这个选项看起来不太像 rails-esque。

任何人都可以提出更好的替代方案来解决这个问题吗?

编辑:下面的答案是一个很好的答案,因为它使事情变得非常简单 - 尽管我担心它可能充满危险,因为它使用 eval (因此永远不可能使用用户代码)。是否有另一种选择(我之前的选项将操作数等分解成块使用constantizeget_instance_variable 的组合 - 有没有一种方法可以用来使字符串的执行更安全)?

【问题讨论】:

  • 为了让事情更清楚一点:在我当前的结构中(操作数和操作是分开的),我可能可以使用自定义帮助器,所以我可以做 calculate_metric(@metrics.where(:name = > 'profit'),@customer,@start_date,@end_date) - 这可以正常工作。我的查询实际上是围绕度量模型的结构,以及计算它的自定义助手;这样做的最佳方法是什么,以便它可扩展且安全(即不使用 eval)?如果有用,我可以用我当前的结构编辑问题。

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


【解决方案1】:

这个问题在很大程度上得到了一些讨论:Rails - Scalable calculation model

对于遇到此问题的任何人,解决方案本质上是确保操作始终有两个操作数,但操作数可以是属性,也可以是先前计算的结果(即它本身可以是度量),并且因此,它具有高度可扩展性。这避免了评估任何内容的需要,从而避免了由此带来的潜在安全漏洞。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    相关资源
    最近更新 更多