2011-08-25 73 views
0

我需要为以前创建的项目添加几天或几小时。将字符串转换为数学运算(例如:“+ 2.days”)

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

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

Date.today+2.days 

其中,“+”是:运营商,“2”是:数,“天”是:unit_of_time但我我不确定如何让插入的属性字符串成为实际的运算符“+ 2.days”。有任何想法吗?

(我已经通过了Ruby文档浇,但无济于事。目前,我只是手动创建的嵌套可能的选项(4)的if/else块......没错这就是恶心。)

回答

6

你可以使用eval,如:

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

...然后简单地使用字符串插值放在变量。但是请注意,如果您可以非常确定数据库中的值总是您希望的值,那么您只应该这样做;在任何情况下用户都不应该改变它们,否则你将会面临一个严重的安全问题,从而危及整个系统。

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

+0

Eval!那真的谢谢你!是的,这些变量经过严格测试,但正如你提到冗长,如果块更明确。所以这可能不是一件坏事。 – GoodGets

3

所有红宝石对象都有一个发送方法可用于通过名称带参数运行方法。使用发送以及将字符串转换为整数(.to_i)应该就足够了。

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

红宝石很美!

+0

太完美了!谢谢克里斯。我知道有一种方法,只是从来没有新的如何正确使用“发送”。谢谢 – GoodGets

+1

甜蜜,这对我在不想使用eval时评估字符串表达式非常有用:''cat'.send('==','dog')' –

相关问题