Jika Anda ingin menggunakan prepare seperti itu maka Anda harus membuat beberapa perubahan:
-
Driver PostgreSQL ingin melihat placeholder bernomor (
$1,$2, ...) bukan tanda tanya dan Anda harus memberi nama pernyataan yang telah Anda siapkan:ActiveRecord::Base.connection.raw_connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1") -
Urutan pemanggilannya adalah
preparediikuti olehexec_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 ])
Pendekatan di atas bekerja untuk saya dengan ActiveRecord dan PostgreSQL, PG::Connection.open Anda versi akan berfungsi jika Anda terhubung dengan benar.
Cara lain adalah dengan mengutip sendiri:
conn = ActiveRecord::Base.connection
conn.execute(%Q{
delete from my_table
where id = #{conn.quote(id)}
})
Hal seperti itulah yang biasanya dilakukan ActiveRecord di belakang Anda.
Berinteraksi langsung dengan database cenderung sedikit berantakan dengan Rails karena orang-orang Rails tidak berpikir Anda harus melakukannya.
Jika Anda benar-benar hanya mencoba menghapus satu baris tanpa gangguan, Anda dapat menggunakan delete :
hapus()
[...]
Baris hanya dihapus dengan SQL
DELETEpernyataan pada kunci utama record, dan tidak ada panggilan balik yang dieksekusi.
Jadi Anda bisa mengatakan ini:
MyTable.delete(id)
dan Anda akan mengirim delete from my_tables where id = ... ke dalam basis data.