2010-06-04 70 views
17

我有一个没有ID列的表。当我尝试使用ActiveRecord从中删除时,生成的SQL为DELETE FROM table_name WHERE ID=NULL,这显然不起作用。有没有办法使用ActiveRecord从表中删除,或者至少用占位符运行原始SQL删除查询(所以它不容易受SQL注入攻击)?如何销毁没有ID列的记录在ruby ActiveRecord中?

回答

24

您是否尝试过使用ActiveRecord的delete_all方法?下面是我的一个沙箱的摘录:

>> 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 

生成的SQL是DELETE FROM `customers` WHERE (`customers`.`login` = 'foo')

退房的documentation

+0

这是要走的路。我正要回答这个问题。 – 2010-06-05 14:59:15

+0

这不适用于所有情况。我有一个模型游戏和一个模型AppVersion。游戏has_many:app_versions。 'Game.first.app_versions.delete_all'产生'DELETE FROM'app_versions'WHERE'app_versions'。''= NULL',这是一个错误。 – 2012-02-14 12:53:19

+0

当你在一个关系上使用它时,Rails4.2说在'.delete_all'方法中,只有两个选项可以传递:':nullify',它在foreing_keys和':delete_all'上设置null,它实际上删除了这些对象。默认值是':nullify'。 – mariowise 2015-05-26 12:43:01

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

我认为你需要有一个ActiveRecord的唯一id列来正常工作,但我不是100%确定的。

+0

AFAIK这不符合占位符的工作。 – Johnny 2010-06-04 22:58:44

+0

'sanitize_sql_array'将解决占位符问题。 – x1a4 2010-06-05 02:13:29