2010-06-04 13 views
17

Tengo una tabla sin una columna de ID. Cuando intento eliminarlo usando ActiveRecord, el SQL generado es DELETE FROM table_name WHERE ID=NULL, lo que obviamente no funciona. ¿Hay alguna manera de eliminar de la tabla utilizando ActiveRecord, o al menos ejecutar una consulta de eliminación de SQL sin formato con marcadores de posición (por lo que no es vulnerable a la inyección de SQL)?¿cómo puedo destruir un registro sin una columna de identificación en ActiveRecord ruby?

Respuesta

24

¿Ha intentado utilizar el método delete_all de ActiveRecord? He aquí un extracto en un entorno limitado mío:

>> customer = Customer.new(:login => 'foo') 
=> #<Customer id: nil, status: 0, name: nil, login: "foo", password: nil, salt: nil, api_key: nil, address: nil, town: nil, state: nil, country: "USA", zipcode: nil, balance: #<BigDecimal:1032669b0,'0.0',9(18)>, discount: 0, last_four_cc: nil, auto_renew: false, contact_name: nil, contact_email: nil, domain: "anon.limelock.com", created_at: nil, updated_at: nil> 
>> customer.save 
=> true 
>> Customer.all.count 
=> 4 
>> Customer.delete_all(:login => 'foo') 
=> 1 
>> Customer.all.count 
=> 3 

El SQL generado es DELETE FROM `customers` WHERE (`customers`.`login` = 'foo')

Mira la documentation

+0

Este es el camino a seguir. Iba a responder esto. –

+0

Esto no funciona en todos los casos. Tengo un juego modelo y un modelo AppVersion. El juego has_many: app_versions. 'Game.first.app_versions.delete_all' produce' DELETE FROM 'app_versions' WHERE 'app_versions'. '' = NULL', que es un error. –

+0

Cuando usa esto en una relación, Rails 4.2 dice que en el método '.delete_all', solo hay dos opciones para pasar:': nullify' que establece null en foreing_keys y ': delete_all' que realmente elimina esos objetos. Y el valor predeterminado es ': nullify'. – mariowise

8
ActiveRecord::Base.connection.execute('DELETE FROM table_name WHERE ...') 

Creo que debe tener una columna de identificación única para que ActiveRecord funcione correctamente, pero no estoy 100% seguro.

+0

Aparentemente, este no funciona con marcadores de posición. – Johnny

+0

'sanitize_sql_array' resolverá el problema del marcador de posición. – x1a4

Cuestiones relacionadas