2010-11-23 6 views
0

私はPGのドキュメントhere:に応じて、当社のPG 8.3データベースのいずれかにトリガー・ベースparitioningスキームを設定しました。基本的には、いくつかの子テーブルとともに親テーブルがあります。親の挿入トリガーは、親の挿入を適切な子テーブルにリダイレクトします。これはうまくいきます。ActiveRecordは、Postgresのとパーティション表

のActiveRecordのPGアダプタは、しかし、最初の挿入後に返された行のIDを取得するには、「ID」の拡張子をRETURNING ... PostgresのINSERTに依存しているようです。しかしトリガはRETURNING句を破るようです - idは返されませんが、行は正しく作成されます。

私はこの動作が理にかなっていますが、結局何もメインテーブルに何も挿入されていないと思いますが、実際にはいくつかの回避策を見つける必要があります。ちょうど挿入された行

挿入する前に行に一意のIDを追加して、挿入後にこのキーを使用して再読み込みすることができますが、これはかなりクルージングのようです。誰かがより良い回避策を持っていますか?

答えて

0

現在のところ、私の最良の選択肢は、before_createイベントのテーブルプレフィックスを変更して、インサートトリガをまったく迂回して、基礎となるパーティションテーブルに直接挿入することです。しかし、これは完璧な解決策ではありませんが、最も効果的で簡単な方法です。

私が思いつくことができる唯一の解決策は、各テーブルにguid列を追加し、idを取得するために挿入の直後にguidで行を再読み込みすることです。

その他のご提案は歓迎します。 Thanx -m

4

以降、PostgreSQLAdapterの#supports_insert_with_returningメソッドをオーバーライドするだけで、「return id」の動作を無効にすることができます。

class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter 
    def supports_insert_with_returning? 
    false 
    end 
end 
関連する問題