Я разрабатываю (в настоящее время) приложение Rails 2.3.x с базой данных PostgreSQL 8.4. В моем приложении на Rails у меня есть модель, соответствующая таблице базы данных, которая имеет два столбца с типом данных SERIAL и установлена как NOT NULL. У меня один из этих столбцов установлен как первичный ключ в Rails и как ограничение PostgreSQL.
Определение таблицы:
CREATE TABLE problem_table
(
col1 serial NOT NULL,
col2 serial NOT NULL,
other_col1 character varying,
other_col2 character varying,
...,
CONSTRAINT problem_table_pkey PRIMARY KEY (col1)
);
Определение класса модели:
class ModelClass1 < ActiveRecord::Base
self.table_name = 'problem_table'
self.primary_key = 'col1'
end
Моя проблема связана со столбцом SERIAL NOT NULL без первичного ключа. Когда я пытаюсь сделать Rails ActiveRecord :: Base # create, Rails справедливо не устанавливает значение для столбца SERIAL NOT NULL первичного ключа, а устанавливает значение столбца NULL для другого, что заставляет PostgreSQL жаловаться, что Для столбца NOT NULL задано значение NULL.
Что я говорю Rails делать:
ModelClass1.create(
other_col1: 'normal'
other_col2: 'data',
...
);
Что Rails сообщает PostgreSQL:
INSERT INTO problem_table (
col2,
other_col1,
other_col2,
...
) VALUES (
NULL,
'normal',
'data',
...
);
Мой вопрос: как я могу заставить Rails перестать передавать NULL для этого столбца и просто ничего не передавать, позволяя DEFAULT nextval (my_seq) вступать во владение? Или, если это невозможно, как я могу сказать PostgreSQL игнорировать это значение NULL при его передаче и / или признать, что оно совпадает с 'set as DEFAULT'?
Я бы попытался просто пропатчить внутренние компоненты Rails 2.3.x ActiveRecord, но я знаю, что если бы я это сделал, то был бы не уверен, когда дело доходит до перехода на Rails 3.
Я пытался исправить положение с помощью триггера PL / pgSQL ПЕРЕД ВСТАВКОЙ, но не могу понять, как сказать PostgreSQL с PL / pgSQL «отменить определение» значения NEW.col2 или сказать NEW.col2 : = ПО УМОЛЧАНИЮ (что не работает).
Ответы и / или предложения приветствуются!