Se você quiser usar
prepare
assim, você precisará fazer algumas alterações:-
O driver PostgreSQL deseja ver os espaços reservados numerados ($1
,$2
, ...) não pontos de interrogação e você precisa dar um nome à sua declaração preparada:
ActiveRecord::Base.connection.raw_connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1")
-
A sequência de chamada éprepare
seguido porexec_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 ])
A abordagem acima funciona para mim com ActiveRecord e PostgreSQL, seu
PG::Connection.open
versão deve funcionar se você estiver se conectando corretamente. Outra maneira é fazer a citação você mesmo:
conn = ActiveRecord::Base.connection
conn.execute(%Q{
delete from my_table
where id = #{conn.quote(id)}
})
Esse é o tipo de coisa que o ActiveRecord geralmente faz nas suas costas.
Interagir diretamente com o banco de dados tende a ser um pouco confuso com o Rails, já que o pessoal do Rails acha que você nunca deveria fazer isso.
Se você realmente está apenas tentando excluir uma linha sem interferência, pode usar
delete
:
excluir()
[...]
A linha é simplesmente removida com um SQLDELETE
instrução na chave primária do registro e nenhum retorno de chamada é executado.
Então você pode apenas dizer isso:
MyTable.delete(id)
e você enviará um simples
delete from my_tables where id = ...
no banco de dados.