Ruby on rails 在RubyonRails中在数据库上存储动态时间长度

Ruby on rails 在RubyonRails中在数据库上存储动态时间长度,ruby-on-rails,Ruby On Rails,好的,我需要这样的东西: time_span = "1.month" date = DateTime.now date = date + send("#{time_span}") 时间跨度实际存储在数据库中,但这似乎不起作用。。 下面是一些控制台操作: $ rails c >> time_span = 1.month => 1 month >> date = DateTime.now + time_span => Fri, 27 Aug 2010 20

好的,我需要这样的东西:

time_span = "1.month" 
date = DateTime.now 
date = date + send("#{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
在这种情况下并没有按照文档中的建议使用,但我看到它是以这种方式使用的。

尝试使用:

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

您可能需要
eval
,而不是
send
。。。但另一方面,您可能应该避免使用
eval

如果
time\u span
的格式始终为
1.month
(即用点分隔的大小和单位),则可以将其解析为对象调用:

magnitude, unit = time_span.split('.')
date += magnitude.to_i.send(unit)
另一种解决方案是将震级和单位分别保存在数据库中,然后执行相同的操作,
将单位发送到震级


显然,如果大小不是一个数字,或者单位不是Rails的某个扩展名,那么这将不起作用。

另一个解决方案是在数据库中序列化1.5个月

class User < ActiveRecord::Base
  serialize :preferences
end
class用户

请参见

eval通常不被鼓励,因为它可能是一个漏洞——如果您不严格控制评估内容,您可以为攻击者提供一个很好的方法来入侵您的系统(因为eval将评估应用程序上下文中给出的任何字符串)