2010-07-28 288 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