Se vuoi usare prepare
in questo modo dovrai apportare un paio di modifiche:
-
Il driver PostgreSQL vuole vedere i segnaposto numerati (
$1
,$2
, ...) non punti interrogativi e devi dare un nome alla tua dichiarazione preparata:ActiveRecord::Base.connection.raw_connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1")
-
La sequenza di chiamata è
prepare
seguito daexec_prepared
:connection = ActiveRecord::Base.connection.raw_connection connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1") st = connection.exec_prepared('some_name', [ id ])
L'approccio di cui sopra funziona per me con ActiveRecord e PostgreSQL, il tuo PG::Connection.open
la versione dovrebbe funzionare se ti connetti correttamente.
Un altro modo è quello di citare tu stesso:
conn = ActiveRecord::Base.connection
conn.execute(%Q{
delete from my_table
where id = #{conn.quote(id)}
})
Questo è il genere di cose che ActiveRecord fa solitamente alle tue spalle.
L'interazione diretta con il database tende a essere un po' un pasticcio con Rails poiché le persone di Rails non pensano che dovresti mai farlo.
Se stai davvero solo cercando di eliminare una riga senza interferenze, puoi utilizzare delete
:
elimina()
[...]
La riga viene semplicemente rimossa con un SQL DELETE
istruzione sulla chiave primaria del record e non vengono eseguiti callback.
Quindi puoi semplicemente dire questo:
MyTable.delete(id)
e invierai un semplice delete from my_tables where id = ...
nel database.