Nếu bạn muốn sử dụng prepare
như vậy thì bạn sẽ cần thực hiện một số thay đổi:
-
Trình điều khiển PostgreSQL muốn xem các trình giữ chỗ được đánh số (
$1
,$2
, ...) không phải dấu chấm hỏi và bạn cần đặt tên cho câu đã chuẩn bị của mình:ActiveRecord::Base.connection.raw_connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1")
-
Trình tự gọi là
prepare
theo sau làexec_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 ])
Phương pháp trên phù hợp với tôi với ActiveRecord và PostgreSQL, PG::Connection.open
của bạn phiên bản sẽ hoạt động nếu bạn đang kết nối đúng cách.
Một cách khác là tự mình trích dẫn:
conn = ActiveRecord::Base.connection
conn.execute(%Q{
delete from my_table
where id = #{conn.quote(id)}
})
Đó là điều mà ActiveRecord thường làm sau lưng bạn.
Tương tác trực tiếp với cơ sở dữ liệu có xu hướng hơi rắc rối với Rails vì Rails mọi người không nghĩ rằng bạn nên làm điều đó.
Nếu bạn thực sự chỉ đang cố gắng xóa một hàng mà không bị can thiệp, bạn có thể sử dụng delete
:
xóa ()
[...]
Hàng chỉ được xóa bằng
DELETE
trong SQL trên khóa chính của bản ghi và không có lệnh gọi lại nào được thực thi.
Vì vậy, bạn chỉ có thể nói điều này:
MyTable.delete(id)
và bạn sẽ gửi một delete from my_tables where id = ...
vào cơ sở dữ liệu.