2010-11-23 35 views
0

J'ai mis en place un schéma de partitionnement basé sur un trigger sur l'une de nos bases de données pg 8.3 selon le document pg docs here:. Fondamentalement, j'ai une table parent, avec plusieurs tables enfants. Un déclencheur d'insertion sur le parent redirige les insertions sur le parent dans la table enfant appropriée - cela fonctionne bien. Cependant, l'adaptateur pg ActiveRecord semble s'appuyer sur l'extension "id" postgres INSERT ... RETURNING pour obtenir l'id de la ligne retournée après l'insertion initiale. Mais le déclencheur semble rompre la clause RETURNING - aucun ID n'est retourné, bien que la ligne soit créée correctement. Bien que je suppose que ce comportement a du sens - après tout, rien n'est inséré dans la table principale, j'ai vraiment besoin de trouver une sorte de contourner le problème, car d'autres enregistrements enfant seront insérés qui nécessitent l'identifiant de ligne de la ligne juste-insérée.Tables ActiveRecord, Postgres et partitionnées

Je suppose que je pourrais ajouter une sorte d'identifiant unique à ranger avant de l'insérer et ensuite le relire en utilisant cette clé après l'insertion, mais cela semble assez kludgy. Est-ce que quelqu'un a une meilleure solution de rechange?

Répondre

0

Actuellement, il semble que ma meilleure option consiste simplement à changer le préfixe de table dans un événement before_create afin que l'insertion se fasse directement sur la table de partition sous-jacente, en ignorant complètement le trigger d'insertion. Ce n'est pas une solution parfaite, cependant, mais semble être le plus performant et le plus simple.

La seule autre solution que je peux proposer est d'ajouter une colonne guid à chaque table, et relire la ligne de la table de partition par guid immédiatement après l'insertion pour obtenir l'ID.

Toutes les autres suggestions sont les bienvenues. Thanx - m

4

Depuis Rails v.2.2.1, vous pouvez désactiver le comportement 'return id' en remplaçant la méthode #supports_insert_with_returning dans PostgreSQLAdapter.

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