PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Masalah dengan rentang waktu tak terbatas di Rails

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL hapus semua konten

  2. KesalahanManajemen Transaksi?

  3. IntegrityError saat menyimpan item baru ke db postgresql di Django?

  4. Bagaimana cara mengubah kolom PG menjadi NULLABLE TRUE?

  5. Cara Mencatat Kueri di PostgreSQL