2012-12-19 5 views
5

Sto provando a inserire valori tramite un'istruzione preparata utilizzando ActiveRecord. Tuttavia, ogni volta che provo:Preparare ed eseguire istruzioni con ActiveRecord utilizzando PostgreSQL

conn = ActiveRecord::Base.connection 
conn.prepare "SELECT * from sampletable where id = $1" 
conn.execute 3 

Dopo la seconda affermazione, ottengo:

NoMethodError: undefined method `prepare' for 
#<ActiveRecord::ConnectionAdapters::PostgreSQLAdapter:0x000001027442c8> 

Cosa devo fare? Io corro Rails 3.2.1 e Ruby 1.9.2

UPDATE:

ho risolto il problema. Grazie per la risposta, ma non ha funzionato con PostgreSQL. Il modo per farlo è:

stmt = "SELECT * from sampletable where id = $1 and name = $2" 
values = [ { value: 1}, { value: "henry" } ] 

in cui i valori è un array di hash, ognuna delle quali specifica un valore, $ 1 è destinata a l'hash 0a, $ 2 è destinato al 2 ° hash nella matrice e così via

con = PG::Connection.new(:dbname => "development_DB") 
con.prepare("insert", stmt) 
con.exec_prepared("insert", values) 
con.close() 

E questo, signore e signori, funziona!

+0

Se siete gioco per ricapitolare la soluzione come la propria risposta, io cancello la mia risposta. (Vedi http://meta.stackexchange.com/questions/90263/unanswered-question-answered-in-comments per l'elaborazione del motivo per cui questo è utile.) Grazie! – DreadPirateShawn

risposta

4

copia la risposta dal corpo domanda modificato, al fine di eliminare questa domanda dal filtro "Senza risposta":

ho risolto il problema. Grazie per la risposta, ma non ha funzionato per PostgreSQL. Il modo per farlo è:

stmt = "SELECT * from sampletable where id = $1 and name = $2" 
values = [ { value: 1}, { value: "henry" } ] 

in cui i valori è un array di hash, ognuna delle quali specifica un valore, $ 1 è legato alla hash 0a, $ 2 è destinato al 2 ° hash nella matrice e così su

con = PG::Connection.new(:dbname => "development_DB") 
con.prepare("insert", stmt) 
con.exec_prepared("insert", values) 
con.close() 

E questo, signore e signori, funziona!

~ risposta per alalani

+1

Invece di ricreare una nuova connessione db ('con = PG :: Connection.new (: dbname =>" development_DB ")'), penso che sarebbe meglio ottenere qualsiasi connessione esistente dal tuo adattatore, in questo modo: 'con = ActiveRecord :: Base.connection.raw_connection' Altrimenti, funziona benissimo! – qix