Ако искате да използвате prepare
така, тогава ще трябва да направите няколко промени:
-
Драйверът на PostgreSQL иска да види номерирани заместители (
$1
,$2
, ...) не въпросителни и трябва да дадете име на подготвеното изявление:ActiveRecord::Base.connection.raw_connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1")
-
Последователността на извикване е
prepare
последвано от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 ])
Горният подход работи за мен с ActiveRecord и PostgreSQL, вашият PG::Connection.open
версията трябва да работи, ако се свързвате правилно.
Друг начин е да цитирате сами:
conn = ActiveRecord::Base.connection
conn.execute(%Q{
delete from my_table
where id = #{conn.quote(id)}
})
Това е нещото, което ActiveRecord обикновено прави зад гърба ви.
Директното взаимодействие с базата данни обикновено е малко бъркотия с Rails, тъй като хората от Rails не смятат, че някога трябва да го правите.
Ако наистина просто се опитвате да изтриете ред без намеса, можете да използвате delete
:
изтриване()
[...]
Редът просто се премахва с SQL
DELETE
оператор на първичния ключ на записа и не се изпълняват обратни извиквания.
Така че можете просто да кажете това:
MyTable.delete(id)
и ще изпратите просто delete from my_tables where id = ...
в базата данни.