【问题标题】:How do you delete an ActiveRecord object?如何删除 ActiveRecord 对象?
【发布时间】:2011-05-09 19:50:06
【问题描述】:

如何删除 ActiveRecord 对象?

我查看了Active Record Querying,它没有任何可以删除的内容。

  1. id删除,

  2. 删除当前对象如:user.remove,

  3. 可以根据where 子句删除吗?

【问题讨论】:

    标签: ruby-on-rails rails-activerecord


    【解决方案1】:

    destroydestroy_all 方法,比如

    user.destroy
    User.find(15).destroy
    User.destroy(15)
    User.where(age: 20).destroy_all
    User.destroy_all(age: 20)
    

    您也可以使用deletedelete_all,它们不会强制执行:before_destroy:after_destroy 回调或任何相关的关联选项。

    User.delete_all(condition: 'value') 将允许您删除记录 没有主键

    注意:根据@hammady 的评论,如果用户模型没有主键,user.destroy 将不起作用。

    注 2:来自 @pavel-chuchuva 的评论,destroy_all with conditions 和 delete_all with conditions 在 Rails 5.1 中已被弃用 - 请参阅 guides.rubyonrails.org/5_1_release_notes.html

    【讨论】:

    • 如果您可以在答案中包含@hammady 的评论,那就太好了。努力找出为什么我不能销毁我的模型对象...
    • 为什么它只更新我数据库中的deleted_at列数据?如何删除整行数据?
    • destroy_all with conditions 和 delete_all with conditions 在 Rails 5.1 中已被弃用 - 请参阅 guides.rubyonrails.org/5_1_release_notes.html
    • 这个User.find_by(username:"bob") 也可以很好地识别要销毁或删除的记录。
    【解决方案2】:
    1. User.destroy

    User.destroy(1) 将删除带有id == 1:before_destroy:after_destroy 回调的用户。例如,如果您有关联的记录

    has_many :addresses, :dependent => :destroy
    

    用户被销毁后,他的地址也将被销毁。 如果你改用删除操作,回调将不会发生。

    1. User.destroy, User.delete

    2. User.destroy_all(<conditions>)User.delete_all(<conditions>)

    注意:用户是一个类,用户是一个实例对象

    【讨论】:

    • 感谢您处理相关记录。
    • 注意:User.destroy_all() 运行回调,因此在删除任何内容之前,它会加载记录。这是两条 SQL 语句,而不是一条。除了性能影响之外,这也有并发影响。更安全的调用跳过回调; User.delete_all() 将只发出一个 DELETE FROM... 命令。
    • destroy_all with conditions 已在 Rails 5.1 中弃用 - 请参阅 guides.rubyonrails.org/5_1_release_notes.html
    【解决方案3】:

    deletedelete_alldestroydestroy_all

    文档是:older docsRails 3.0.0 docs

    delete 不会实例化对象,而destroy 会。一般来说,deletedestroy 快。

    【讨论】:

    • delete 更快,但会绕过您可能在模型上定义的回调
    【解决方案4】:

    如果您使用的是 Rails 5 及更高版本,以下解决方案将起作用。

    #delete based on id
    user_id = 50
    User.find(id: user_id).delete_all
    
    #delete based on condition
    threshold_age = 20
    User.where(age: threshold_age).delete_all
    

    https://www.rubydoc.info/docs/rails/ActiveRecord%2FNullRelation:delete_all

    【讨论】:

      【解决方案5】:

      从特定表中删除一行或从表中删除记录集非常简单,您只需在控制台中按其 Id 获取记录集,然后删除或销毁它。

      【讨论】:

        猜你喜欢
        • 2014-11-28
        • 2013-10-28
        • 2019-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多