2011-08-25 78 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')' –

相關問題