我正在为朋友的心理调查项目创建一个简单的Ruby on Rails调查应用程序.所以我们有调查,每个调查都有一堆问题,每个问题都有参与者可以选择的选项之一.没什么好激动的.
其中一个有趣的方面是每个答案选项都有一个与之相关的分数值.因此,对于每个调查,需要根据这些值计算总分.
现在我的想法是代替硬编码计算,允许用户添加一个公式,通过该公式计算总调查分数.示例公式:
"Q1 + Q2 + Q3"
"(Q1 + Q2 + Q3) / 3"
"(10 - Q1) + Q2 + (Q3 * 2)"
Run Code Online (Sandbox Code Playgroud)
所以只是基本的数学(为了清晰起见,附加一些括号).我们的想法是保持公式非常简单,这样任何拥有基本数学的人都可以输入它们,而无需解析某些奇特的语法.
我的想法是采用任何给定的公式,并用基于参与者选择的分数值替换Q1,Q2等占位符.然后eval()新形成的字符串.像这样的东西:
f = "(Q1 + Q2 + Q3) / 2" # some crazy formula for this survey
values = {:Q1 => 1, :Q2 => 2, :Q3 => 2} # values for substitution
result = f.gsub(/(Q\d+)/) {|m| values[$1.to_sym] } # string to be eval()-ed
eval(result)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
有一个更好的方法吗?我愿意接受任何建议.
如何处理并非所有占位符都被成功替换的公式(例如,一个问题没有得到解答)?例如:{:Q2 => 2}不是值哈希?我的想法是拯救eval(),但在这种情况下它不会失败因为coz (1 + …