Anda tidak dapat menyimpan Infinity sebagai bagian dari rentang waktu di Rails. Saya percaya ini karena Infinity akan dimasukkan sebagai nilai string dan ditafsirkan sebagai float ketika ditarik keluar dari oid PSQL asli. Jadi, rentang tanggal apa pun dari Tanggal -> Float tidak akan layak. Tetapi Anda dapat mengatur untuk membuat rentang Anda sendiri dengan tanggal semu (1 juta tahun dari sekarang) atau Anda dapat menggunakan dua bidang tanggal terpisah dan menafsirkannya dengan tepat dalam model. Tanggal mulai, tanggal akhir.
Di Rails 4.2+, Anda dapat menyimpan nilai Float::INFINITY di dalam tipe datetime Anda. Contoh.
User.first.update(begin_date: DateTime.now, end_date: 'infinity')
User.first.end_date # => Infinity
Namun, end_date
tidak akan menjadi tanggal yang valid. Anda hanya menyimpan string di database dan Anda mengeluarkan float saat Anda meneleponnya.
Inilah kode aktual (Rails 4.2) yang menanganinya:
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
Sekali lagi, Anda tidak dapat melakukan perbandingan waktu tanggal dengan float. Tapi, mungkin cukup sederhana untuk memiliki kasus khusus untuk dua nilai ini -::Float::INFINITY
dan ::Float::INFINITY