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
prepare
diikuti 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
DELETE
pernyataan 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.