Jeśli chcesz użyć prepare w ten sposób będziesz musiał dokonać kilku zmian:
-
Sterownik PostgreSQL chce widzieć ponumerowane symbole zastępcze (
$1,$2, ...) nie pytajniki i musisz nadać swojemu wyrażeniu nazwę:ActiveRecord::Base.connection.raw_connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1") -
Sekwencja wywołań to
preparepo którym następujeexec_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 ])
Powyższe podejście działa dla mnie z ActiveRecord i PostgreSQL, twoim PG::Connection.open wersja powinna działać, jeśli łączysz się prawidłowo.
Innym sposobem jest samodzielne zacytowanie:
conn = ActiveRecord::Base.connection
conn.execute(%Q{
delete from my_table
where id = #{conn.quote(id)}
})
To jest rodzaj rzeczy, które ActiveRecord zwykle robi za twoimi plecami.
Bezpośrednia interakcja z bazą danych jest w przypadku Railsów trochę bałaganem, ponieważ ludzie Rails uważają, że nigdy nie powinieneś tego robić.
Jeśli naprawdę próbujesz tylko usunąć wiersz bez zakłóceń, możesz użyć delete :
usuń()
[...]
Wiersz jest po prostu usuwany za pomocą polecenia SQL DELETE oświadczenie na kluczu podstawowym rekordu i żadne wywołania zwrotne nie są wykonywane.
Możesz więc po prostu powiedzieć:
MyTable.delete(id)
a wyślesz proste delete from my_tables where id = ... do bazy danych.