将字符串转换为数学运算(例如:" + 2.days")

时间:2011-08-25 17:58:41

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

我需要为之前创建的项目添加天或小时。

系统可以根据存储在db,:operator(add / subtract),:unit_of_time(hours / days)和:number中的属性来增加或减去一定数量的小时或天数。

我希望能够做到这样的事情:

Date.today+2.days

其中“+”是:运算符,“2”是:数字,“days”是:unit_of_time但我不确定如何使插值的属性字符串成为实际运算符“+2 。天”。有什么想法吗?

(我已经完成了ruby文档,但无济于事。目前,我只是在嵌套的if / else块中手动创建可能的选项(4)......是的,这很糟糕。)

2 个答案:

答案 0 :(得分:6)

您可以使用eval,例如:

eval("Date.today+2.days")

...然后只需使用字符串插值来输入变量。但请注意,如果您可以确定数据库中的值始终是您希望的值,那么您应该只执行此操作;在任何情况下,用户都不能更改它们,否则您将遇到严重的安全问题,这会影响整个系统。

使用更多冗长的方法,例如您建议的if语句(或case语句),需要您编写更多代码,但它们更安全。

答案 1 :(得分:3)

所有ruby对象都有一个发送方法,该方法可用于按名称和参数运行方法。使用发送以及将字符串转换为整数( .to_i )就足够了。

Date.today.send '+', '1'.to_i.send('months') # This works
Date.today.send operator, number.to_i.send(unit) # Generalized form

Ruby很漂亮!