2010-07-28 246 views
0

好存放的時間長度動態,所以我需要的東西是這樣的:數據庫在Ruby on Rails的

time_span = "1.month" 
date = DateTime.now 
date = date + send("#{time_span}") 

其中time_span實際上是存儲在數據庫中,但是這似乎並沒有工作.. 下面是一些控制檯操作:

$ rails c 
>> time_span = 1.month 
=> 1 month 
>> date = DateTime.now + time_span 
=> Fri, 27 Aug 2010 20:51:18 -0500 
>> time_span.class 
=> Fixnum 
>> time_span = '1.month' 
=> "1.month" 
>> date = DateTime.now + time_span 
TypeError: expected numeric 
    ruby/1.8/date.rb:1236:in `plus_without_duration' 
    date/calculations.rb:87:in `+' 
    from (irb):5 

的想法是,我需要1.month存儲在數據庫中的字符串,因爲存儲1.month作爲一個Fixnum只存儲在特定月份的總秒數,但我希望它在當前月份更具活力。我知道send在這種情況下沒有被使用,因爲它的文檔建議,但我已經看到它以這種方式使用。

回答

1

嘗試使用:

time_span = "1.month" 
date = DateTime.now + eval(time_span) 
1

相反的send,你可能想eval ...但另一方面,你應該避免使用eval

如果time_span總是在形式1.month(即由點號分隔的幅度和單位。),你可以解析它作爲爲對象調用:

magnitude, unit = time_span.split('.') 
date += magnitude.to_i.send(unit) 

另一種解決方案是保存數據庫中的大小和單位分開,然後做同樣的事情,單位數量。

顯然,如果幅度不是數字或單位不是Rails的ActiveSupport::CoreExtensions::Numeric::Time一個擴充功能,這是不行的。

+0

有什麼不好的eval? – 2010-07-28 02:02:35

+0

'eval'通常是因爲它可能是一個漏洞而不受歡迎 - 如果你不嚴格控制正在評估的內容,你可以爲攻擊者提供一個很好的方法來打入你的系統(因爲eval會評估它給出的任何字符串在您的應用程序的上下文中) – 2010-07-28 03:45:03