2010-11-23 16 views
0

Ich habe ein Trigger-basiertes Partitionierungsschema auf einer unserer pg 8.3-Datenbanken gemäß der pg docs here: eingerichtet. Grundsätzlich habe ich eine Elterntabelle, zusammen mit mehreren Kindtabellen. Ein Einfüge-Trigger für das übergeordnete Element leitet alle Einfügungen für das übergeordnete Element in die entsprechende untergeordnete Tabelle um. Dies funktioniert gut.ActiveRecord, Postgres und partitionierte Tabellen

Der ActiveRecord-PG-Adapter scheint jedoch auf die Postgres-INSERT ... RETURNING-Erweiterung "id" angewiesen zu sein, um die ID der zurückgegebenen Zeile nach der ursprünglichen Einfügung zu erhalten. Aber der Trigger scheint die RETURNING-Klausel zu brechen - es wird keine ID zurückgegeben, obwohl die Zeile korrekt erstellt wurde.

Während ich denke, dieses Verhalten macht Sinn - schließlich wird nichts in der Haupttabelle eingefügt, ich muss wirklich eine Art von umgehen, wie andere untergeordnete Datensätze eingefügt werden, die die Zeilen-ID von benötigen die gerade eingefügte Zeile.

Ich denke, ich könnte vor dem Einfügen eine Art von eindeutigen ID zu Zeile hinzufügen und dann lesen Sie es mit diesem Schlüssel nach dem Einfügen, aber das scheint ziemlich kludgy. Hat jemand eine bessere Work-around?

Antwort

0

Momentan sieht es so aus, als wäre meine beste Option, einfach das Tabellenpräfix in einem before_create-Ereignis zu ändern, so dass die Einfügung direkt in der zugrundeliegenden Partitionstabelle stattfindet und den Insert-Trigger umgeht. Dies ist jedoch keine perfekte Lösung, sondern scheint die performanteste und einfachste zu sein. Die einzige andere Lösung, die ich finden kann, besteht darin, eine Guid-Spalte zu jeder Tabelle hinzuzufügen und die Zeile aus der Parition-Tabelle durch Guid sofort nach dem Einfügen erneut zu lesen, um die ID zu erhalten.

Alle anderen Vorschläge sind willkommen. Danke - m

4

Seit Rails v.2.2.1 können Sie das Verhalten 'returning id' ausschalten, indem Sie einfach die Methode #supports_insert_with_returning in PostgreSQLAdapter überschreiben.

class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter 
    def supports_insert_with_returning? 
    false 
    end 
end 
Verwandte Themen