Si quieres usar prepare
así, tendrás que hacer un par de cambios:
-
El controlador PostgreSQL quiere ver marcadores de posición numerados (
$1
,$2
, ...) no signos de interrogación y necesita darle un nombre a su declaración preparada:ActiveRecord::Base.connection.raw_connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1")
-
La secuencia de llamada es
prepare
seguido deexec_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 ])
El enfoque anterior me funciona con ActiveRecord y PostgreSQL, su PG::Connection.open
La versión debería funcionar si te estás conectando correctamente.
Otra forma es hacer la cotización usted mismo:
conn = ActiveRecord::Base.connection
conn.execute(%Q{
delete from my_table
where id = #{conn.quote(id)}
})
Ese es el tipo de cosas que ActiveRecord suele hacer a sus espaldas.
La interacción directa con la base de datos tiende a ser un poco complicada con Rails ya que la gente de Rails no cree que debas hacerlo nunca.
Si realmente solo está tratando de eliminar una fila sin interferencias, puede usar delete
:
eliminar()
[...]
La fila simplemente se elimina con un SQL DELETE
instrucción sobre la clave principal del registro y no se ejecutan devoluciones de llamada.
Así que puedes decir esto:
MyTable.delete(id)
y enviará un simple delete from my_tables where id = ...
en la base de datos.