Не можете да съхранявате Infinity като част от времеви диапазон в Rails. Вярвам, че това е така, защото Infinity ще бъде вмъкната като низова стойност и интерпретирана като плаваща стойност, когато бъде извадена от родния PSQL oid. Така че всеки диапазон от дати от Date -> Float няма да бъде жизнеспособен. Но можете да успеете да създадете свой собствен диапазон с псевдо (след 1 милион години) дати или можете просто да използвате две отделни полета за дата и да ги интерпретирате по подходящ начин в модела. Начална дата, крайна дата.
В Rails 4.2+ можете да съхранявате стойност на Float::INFINITY във вашия тип дата и час. Пример.
User.first.update(begin_date: DateTime.now, end_date: 'infinity')
User.first.end_date # => Infinity
Въпреки това, end_date
няма да е валидна дата. Вие просто съхранявате низа в базата данни и изваждате float когато го извикате.
Ето действителния (Rails 4.2) код, който обработва това:
module ActiveRecord
module ConnectionAdapters
module PostgreSQL
module OID # :nodoc:
class DateTime < Type::DateTime # :nodoc:
include Infinity
def type_cast_for_database(value)
if has_precision? && value.acts_like?(:time) && value.year <= 0
bce_year = format("%04d", -value.year + 1)
super.sub(/^-?\d+/, bce_year) + " BC"
else
super
end
end
def cast_value(value)
if value.is_a?(::String)
case value
when 'infinity' then ::Float::INFINITY
when '-infinity' then -::Float::INFINITY
when / BC$/
astronomical_year = format("%04d", -value[/^\d+/].to_i + 1)
super(value.sub(/ BC$/, "").sub(/^\d+/, astronomical_year))
else
super
end
else
value
end
end
end
end
end
end
end
Отново, щенеще да можете да правите сравнения на дата и час с float. Но вероятно е достатъчно просто да има специален случай за тези две стойности -::Float::INFINITY
и ::Float::INFINITY