PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Проблеми с безкраен времеви диапазон в Rails

Не можете да съхранявате 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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MultipleActiveResultSets за модел на данни за postgresql и ado.net

  2. Променете от SQLite към PostgreSQL в нов проект на Rails

  3. Вземете краткото име на деня в PostgreSQL

  4. Ruby 'pg' gem, свързващ грешно копие на libpq.5.dylib (на OSX)

  5. как да използвате правилно оператор if postgresql