【发布时间】:2012-07-02 21:18:38
【问题描述】:
我最近就这个主题提出了几个问题,我想我正在设法缩小我需要做的事情。
我正在尝试在 Rails 应用程序中创建一些“指标”(引用是因为这些指标不应与与应用程序性能相关的指标混淆;这些指标是基于应用程序数据生成的);在我看来,基本上我希望能够使用类似于以下内容的东西:
@metric(@customer,'total_profit','01-01-2011','31-12-2011').result
这将给出给定客户 2011 年的总利润。
当然,我可以使用自定义 result 方法创建指标模型,但我对创建自定义指标(例如,total_profit、total_revenue 等)的最佳方式感到困惑:它们很容易扩展,因此可以在每个用户的基础上添加自定义指标。
我最初的想法是尝试将每个自定义指标的公式存储在具有 operand、operation 和 operation_type 模型的结构中,但这很快就变得非常混乱和冗长,并且被证明很难做到在添加每个指标方面。
我现在的想法是,也许我可以创建一个自定义指标帮助器方法来保存我的每个指标(因此我可以对每个指标进行硬编码,并将变量传递给每个方法),但它的可扩展性如何?这个选项看起来不太像 rails-esque。
任何人都可以提出更好的替代方案来解决这个问题吗?
编辑:下面的答案是一个很好的答案,因为它使事情变得非常简单 - 尽管我担心它可能充满危险,因为它使用 eval (因此永远不可能使用用户代码)。是否有另一种选择(我之前的选项将操作数等分解成块使用constantize 和get_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