Om du vill använda prepare
sådär då måste du göra ett par ändringar:
-
PostgreSQL-drivrutinen vill se numrerade platshållare (
$1
,$2
, ...) inte frågetecken och du måste ge ditt förberedda påstående ett namn:ActiveRecord::Base.connection.raw_connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1")
-
Anropssekvensen är
prepare
följt avexec_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 ])
Ovanstående tillvägagångssätt fungerar för mig med ActiveRecord och PostgreSQL, din PG::Connection.open
version bör fungera om du ansluter korrekt.
Ett annat sätt är att göra citeringen själv:
conn = ActiveRecord::Base.connection
conn.execute(%Q{
delete from my_table
where id = #{conn.quote(id)}
})
Det är sånt som ActiveRecord vanligtvis gör bakom din rygg.
Att direkt interagera med databasen tenderar att vara lite av en röra med Rails eftersom Rails-folket inte tycker att du någonsin ska göra det.
Om du verkligen bara försöker ta bort en rad utan störningar kan du använda delete
:
delete()
[...]
Raden tas helt enkelt bort med en SQL
DELETE
på postens primärnyckel, och inga återuppringningar utförs.
Så du kan bara säga så här:
MyTable.delete(id)
och du skickar en enkel delete from my_tables where id = ...
in i databasen.