PostgreSQL 8.4データベースバックエンドを使用して(現在)Rails2.3.xアプリケーションを開発しています。Railsアプリケーションには、データ型SERIALの2つの列があり、NOTNULLとして設定されているデータベーステーブルに対応するモデルがあります。これらの列の1つを、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
私の問題は、非主キーのSERIALNOTNULL列に関するものです。Rails ActiveRecord :: Base#createを実行しようとすると、Railsは主キーSERIAL NOT NULL列の値を正しく設定しませんが、他の列の列値をNULLに設定します。これにより、PostgreSQLは次のように文句を言います。 NOTNULL列が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)に引き継がせるにはどうすればよいですか?または、それが不可能な場合、渡されたときにこのNULL値を無視するようにPostgreSQLに指示したり、これを「DEFAULTとして設定」と同じであると認識するようにするにはどうすればよいですか?
Rails 2.3.x ActiveRecordの内部にモンキーパッチを適用しようとしましたが、そうすると、Rails3への移行に関しては困惑するでしょう。
INSERTの前にPL/pgSQLトリガーを使用して問題を修正することを検討しましたが、PL / pgSQLを使用するPostgreSQLにNEW.col2値を「定義解除」するか、NEW.col2:=DEFAULTと言う方法がわかりません。 (これは機能しません)。
回答および/または提案をいただければ幸いです。