【问题标题】:how can I destroy a record without an ID column in ruby ActiveRecord?如何在 ruby​​ ActiveRecord 中销毁没有 ID 列的记录?
【发布时间】:2011-02-28 00:35:25
【问题描述】:

我有一个没有 ID 列的表。当我尝试使用 ActiveRecord 从中删除时,生成的 SQL 是DELETE FROM table_name WHERE ID=NULL,这显然不起作用。有什么方法可以使用 ActiveRecord 从表中删除,或者至少运行带有占位符的原始 SQL 删除查询(因此它不容易受到 SQL 注入的攻击)?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    您是否尝试过使用 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

    【讨论】:

    • 这是要走的路。我正要回答这个问题。
    • 这并不适用于所有情况。我有一个模型游戏和一个模型 AppVersion。游戏 has_many :app_versions。 Game.first.app_versions.delete_all 产生 DELETE FROM 'app_versions' WHERE 'app_versions'.'' = NULL,这是一个错误。
    • 当你在关系上使用它时,Rails 4.2 说在 .delete_all 方法上,只有两个选项可以通过::nullify 在 foreing_keys 上设置 null 和 :delete_all 实际上删除那些物体。默认值为:nullify
    【解决方案2】:
    ActiveRecord::Base.connection.execute('DELETE FROM table_name WHERE ...')
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多