Используйте ActiveSupport :: Duration :
string = '05:50'
duration = ActiveSupport::Duration.parse(
# converts string into a ISO8601 duration
"PT" + ['H', 'M'].zip(string.split(':')).join
)
puts duration.since(model.created_at) # 5 hours and 50 minutes in the future
Не то, чтобы это на самом деле ничего не обновляло, так как ваш вопрос очень расплывчатый. Если вы хотите обновить существующие записи, вам нужно позвонить:
model.update(created_at: duration.since(model.created_at))
Для новых записей вы можете использовать обратный вызов, чтобы изменить его в течение жизненного цикла:
class MyModel < ActiveRecord::Base
attribute_accessor :advance_by
before_validate :advance_created_at, if: ->{ advance_by.present? }
private
def advance_created_at
duration = ActiveSupport::Duration.parse(
# converts string into a ISO8601 duration
"PT" + ['H', 'M'].zip(@advance_by.split(':')).join
)
self.advance_by = nil # prevents this from happening repeatedly
self.created_at = duration.since(created_at)
end
end