0

У меня есть таблица, созданная в миграции (только для упрощения задачи), которая выглядит следующим образом:JRuby на Rails с использованием JDBC Postgres (8.4) игнорирует значения по умолчанию

create_table :test_defaults, :force => true do |table| 
    table.integer :failure,  :default => -1, :null => false 
end 

Таким образом, один столбец с именем провала. Когда я исполняю эти рельсы команда:

td = TestDefault.create! 

JRuby терпит неудачу с:

ActiveRecord::StatementInvalid: ActiveRecord::JDBCError: ERROR: null value in column 
"failure" violates not-null constraint: INSERT INTO "test_defaults" ("failure") 
VALUES(NULL) RETURNING "id" 

в то время как версия рубина успешно с запросом, как это:

INSERT INTO "test_defaults" ("failure") VALUES(-1) RETURNING "id" 

Я бег:

ruby 1.8.7, 
rails 2.2.2, 
jruby 1.5.6, 
activerecord-jdbc-adapter (1.1.0) 
activerecord-jdbcpostgresql-adapter (1.1.0) 
jdbc-postgres (8.4.702) 

Предложения a re оценен. Не удалось найти что-нибудь полезное в Google, и даже не знаю, кому сообщить об ошибке.

Cheers.

EDIT: Ha. Кажется, это происходит только с отрицательными значениями по умолчанию. Нуль и больше в порядке.

EDIT2: Из моего ответа ниже, это проблема с кодом вокруг скобок по отрицательным значениям по умолчанию в postgres 8.4. Если кто-то может предложить способ обойти эту проблему, не дожидаясь обновления gem (например, рассказывая postgres об удалении этих скобок), это было бы очень признательно.

ответ

0

Ok. Найден ответ на этот:

activerecord-jdbc-adapter-1.1.0/lib/arjdbc/postgresql/adapter.rb 

мы имеем линии (@ 59):

def default_value(value) 
    # Boolean types 
    return "t" if value =~ /true/i 
    return "f" if value =~ /false/i 

    # Char/String/Bytea type values 
    return $1 if value =~ /^'(.*)'::(bpchar|text|character varying|bytea)$/ 

    # Numeric values 
    return value if value =~ /^-?[0-9]+(\.[0-9]*)?/ 

    # Fixed dates/timestamp 
    return $1 if value =~ /^'(.+)'::(date|timestamp)/ 

    # Anything else is blank, some user type, or some function 
    # and we can't know the value of that, so return nil. 
    return nil 
    end 
end 

Если значение отрицательное по умолчанию возвращается из Postgres, он возвращается, скажем, "(-1)" внутри скобок. Однако указанное выше выражение для чисел не совпадает в скобках.

Пробовал регистрироваться, чтобы регистрировать ошибку (на http://kenai.com/jira/browse/ACTIVERECORD_JDBC), но сервер не работал во время регистрации.

EDIT: Созданный ошибка: http://kenai.com/jira/browse/ACTIVERECORD_JDBC-151

EDIT: Кроме того, в конечном итоге, нуждающихся в этом в том же месте, что и предыдущий код. "(-1)".to_i возвращает 0, что обычно плохо.

def type_cast(value) 
     case type 
      when :integer then value = remove_brackets_from_negative(value) 
     end 
     super 
    end 
    def remove_brackets_from_negative(value) 
     value.gsub!(/[\)\(]/,"") if value.is_a?(String) 
     value 
    end 
+0

Отмечено это как «без ответа», потому что я не очень доволен нынешним решением. – Glenn

+0

Ошибка отмечена как исправленная. – Glenn