8

:transaction_code属性を持つTransactionというモデルがあります。 idと異なる可能性のあるシーケンス番号(たとえば、id=1の取引にはtransaction_code=1000が含まれている可能性があります)でその属性を自動的に埋めたいとします。Ruby on Rails + PostgreSQL:カスタムシーケンスの使用

私はpostgresでシーケンスを作成してからtransaction_codeカラムのデフォルト値をそのシーケンスのnextvalにしようとしました。これは何

INSERT INTO transactions (transaction_code) VALUES (NULL);

は、新しい行を作成することです: 私はRoRの上@transaction.saveを発行するとき、私は、RoRの上@transaction.transaction_codeに任意の値を割り当てない場合の事は、あり、それは以下のSQLを実行するためにしようシーケンスのnextvalを計算して対応する列に挿入するのではなく、transaction_codeをNULLとしてTransactionsテーブルに追加します。したがって、私が知ったように、あなたがpostgresにNULLを指定すると、デフォルト値を持っているかどうかに関わらず、実際にNULLをその列に挿入することを前提としています(私はORACLEの動作が異なります)。

私はこの上の任意の解決策に開いている、のいずれかがデータベース上またはRoRの上で行われている場合:

  • のいずれかのActiveRecordの save
  • から属性を除外するための方法があるか、そこにありますトリガー
  • またはRoRの
  • または他の方法の中にこれらのシーケンス番号を生成する方法がある限り、それは
  • :-)作品として、そこにあると、挿入する前に、列の値を変更する方法

ありがとうございます。

答えて

2

あなたはにしたい場合は、キーワードDEFAULT使用することができ、INSERTステートメントの列にはデフォルト値を挿入 - 引用符なしを:

INSERT INTO mytable (col1, col2) VALUES (105, DEFAULT); 

それとも、中nextval(...)をデフォルトを綴ることができあなたの場合。 manual hereを参照してください。その場合の


トリガーは単純です。実際には、シーケンスの数字だけが入力されていることを確認したい場合は、私がお勧めするものです。サイドノートでは

CREATE OR REPLACE FUNCTION trg_myseq() 
    RETURNS trigger AS 
$BODY$ 
BEGIN 

NEW.mycol := nextval('my_seq'); 
RETURN NEW; 

END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE; 

CREATE TRIGGER myseq 
    BEFORE INSERT 
    ON mytable 
    FOR EACH ROW 
    EXECUTE PROCEDURE trg_myseq(); 

: あなたは数日前の答えに、私が書いた「配列」として、そのためのソリューションを、独自の(非連続)番号を割り当てる場合:
How to specify list of values for a postgresql sequence私はこのCORRを見てみたいと思いますので、私は、このソリューションのparticularily好きではないんだ

before_create :set_transaction_code_sequence 

def set_transaction_code_sequence 
    self.transaction_code = self.class.connection.select_value("SELECT nextval('transaction_code_seq')") 
end 

瞬間のために
+1

あなたの答えはありがとうございました。事は、ActiveRecordのsaveメソッドの中で、DEFAULTキーワードをINSERT内に "送る"ことはできません(そうすれば、そうすることができます)。 Ruby on Railsアプリケーションで100%コード化できるソリューションをデータベースでプログラミングするのではなく、必要に応じて他のDBMSにシームレスに移行できないようにするソリューションを好むだろう。 –

+1

@Ricardo:「別のDBMSにシームレスに移行する」というのは素晴らしいファンタジーですが、現実とはあまり関係がありません。引き金の1つの大きな欠点は、あなたがHeroku共有データベースでそれを使用できないことです。 –

6

、あなたはフェッチし、このようなあなたのRORモデルにシーケンスを割り当てる立ち往生するかもしれませんARで直接扱われています...しかしそれはトリックを行います。