Хранение динамических отрезков времени в базе данных в ruby ​​on rails - PullRequest
0 голосов
/ 28 июля 2010

Хорошо, мне нужно что-то вроде этого:

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 в этом случае не используется, как следует из документации, но я видел, что он использовался таким образом.

Ответы [ 3 ]

1 голос
/ 28 июля 2010

Вместо send вы, вероятно, хотите eval ... но, с другой стороны, вам, вероятно, следует избегать использования eval.

Если time_span всегда имеет форму 1.month (т. Е. Величина и единица, разделенные точкой), вы можете разобрать это как вызов объекта:

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

Другим решением будет сохранение величины и единицы отдельно в базе данных,но затем сделайте то же самое, send единицу к величине.

Очевидно, что это не сработает, если величина не является числом или единица не является расширением Rails 'ActiveSupport::CoreExtensions::Numeric::Time.

1 голос
/ 28 июля 2010

Попробуйте использовать:

time_span = "1.month"
date = DateTime.now + eval(time_span)
0 голосов
/ 28 июля 2010

Другое решение заключается в сериализации 1.month в базе данных.

class User < ActiveRecord::Base
  serialize :preferences
end

см. http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001799

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...