【发布时间】:2011-02-28 00:35:25
【问题描述】:
我有一个没有 ID 列的表。当我尝试使用 ActiveRecord 从中删除时,生成的 SQL 是DELETE FROM table_name WHERE ID=NULL,这显然不起作用。有什么方法可以使用 ActiveRecord 从表中删除,或者至少运行带有占位符的原始 SQL 删除查询(因此它不容易受到 SQL 注入的攻击)?
【问题讨论】:
标签: ruby-on-rails ruby activerecord
我有一个没有 ID 列的表。当我尝试使用 ActiveRecord 从中删除时,生成的 SQL 是DELETE FROM table_name WHERE ID=NULL,这显然不起作用。有什么方法可以使用 ActiveRecord 从表中删除,或者至少运行带有占位符的原始 SQL 删除查询(因此它不容易受到 SQL 注入的攻击)?
【问题讨论】:
标签: ruby-on-rails ruby activerecord
您是否尝试过使用 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')
【讨论】:
Game.first.app_versions.delete_all 产生 DELETE FROM 'app_versions' WHERE 'app_versions'.'' = NULL,这是一个错误。
.delete_all 方法上,只有两个选项可以通过::nullify 在 foreing_keys 上设置 null 和 :delete_all 实际上删除那些物体。默认值为:nullify。
ActiveRecord::Base.connection.execute('DELETE FROM table_name WHERE ...')
我认为 ActiveRecord 需要有一个唯一的 id 列才能正常工作,但我不是 100% 确定。
【讨论】: