Pokud chcete použít prepare
takto budete muset provést několik změn:
-
Ovladač PostgreSQL chce vidět očíslované zástupné symboly (
$1
,$2
, ...) nikoli otazníky a připravený výpis musíte pojmenovat:ActiveRecord::Base.connection.raw_connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1")
-
Volací sekvence je
prepare
následujeexec_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 ])
Výše uvedený přístup mi funguje s ActiveRecord a PostgreSQL, vaším PG::Connection.open
verze by měla fungovat, pokud se správně připojujete.
Dalším způsobem je udělat citaci sami:
conn = ActiveRecord::Base.connection
conn.execute(%Q{
delete from my_table
where id = #{conn.quote(id)}
})
To je druh věcí, které ActiveRecord obvykle dělá za vašimi zády.
Přímá interakce s databází bývá u Rails trochu nepořádek, protože lidé z Rails si nemyslí, že byste to někdy měli dělat.
Pokud se opravdu pokoušíte smazat řádek bez rušení, můžete použít delete
:
delete()
[...]
Řádek se jednoduše odstraní pomocí SQL
DELETE
příkaz na primárním klíči záznamu a neprovádějí se žádná zpětná volání.
Takže můžete říct toto:
MyTable.delete(id)
a odešlete jednoduché delete from my_tables where id = ...
do databáze.