Wenn Sie prepare
verwenden möchten so müssen Sie ein paar Änderungen vornehmen:
-
Der PostgreSQL-Treiber möchte nummerierte Platzhalter sehen (
$1
,$2
, ...) keine Fragezeichen und Sie müssen Ihrer vorbereiteten Anweisung einen Namen geben:ActiveRecord::Base.connection.raw_connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1")
-
Die Aufrufsequenz ist
prepare
gefolgt vonexec_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 ])
Der obige Ansatz funktioniert bei mir mit ActiveRecord und PostgreSQL, Ihrem PG::Connection.open
Version sollte funktionieren, wenn Sie sich richtig verbinden.
Eine andere Möglichkeit besteht darin, selbst zu zitieren:
conn = ActiveRecord::Base.connection
conn.execute(%Q{
delete from my_table
where id = #{conn.quote(id)}
})
Das ist es, was ActiveRecord normalerweise hinter Ihrem Rücken tut.
Die direkte Interaktion mit der Datenbank neigt dazu, mit Rails etwas umständlich zu sein, da die Rails-Leute denken, dass Sie das niemals tun sollten.
Wenn Sie wirklich nur versuchen, eine Zeile ohne Störung zu löschen, können Sie delete
verwenden :
löschen()
[...]
Die Zeile wird einfach mit einem SQL DELETE
entfernt -Anweisung auf den Primärschlüssel des Datensatzes, und es werden keine Rückrufe ausgeführt.
Sie können also einfach Folgendes sagen:
MyTable.delete(id)
und Sie senden ein einfaches delete from my_tables where id = ...
in die Datenbank.