如何删除ActiveRecord对象?

377

如何删除ActiveRecord对象?

我查阅了Active Record查询指南,但没有找到关于删除的内容。

  1. 通过 id 进行删除,

  2. 像这样删除当前对象:user.remove

  3. 能否基于 where 子句进行删除?

5个回答

643

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模型没有主键,则user.destroy将无法工作。

注意2:根据@pavel-chuchuva的评论,带有条件的destroy_all和带有条件的delete_all已在Rails 5.1中弃用-请参见guides.rubyonrails.org/5_1_release_notes.html


4
如果您能在回答中包含@hammady的评论,那就太好了。我曾经苦苦思索为什么无法销毁我的模型对象... - the_critic
2
https://dev59.com/NnA85IYBdhLWcg3wBO3h - the_critic
为什么它只更新了我的数据库中的deleted_at列数据?我如何删除整行数据? - TommyQu
1
在Rails 5.1中,带有条件的destroy_all和delete_all已被弃用 - 请参见https://guides.rubyonrails.org/5_1_release_notes.html。 - Pavel Chuchuva
这个 User.find_by(username:"bob") 也可以用来识别要删除的记录。 - barlop
显示剩余3条评论

67

delete, delete_all, destroy, 和 destroy_all.

文档链接分别为: 旧版文档Rails 3.0.0 版本文档

delete 不会实例化对象,destroy 会。通常来说,deletedestroy 更快速。


9
delete 操作更快,但会绕过您在模型上定义的回调函数。 - Rudi

52
  1. User.destroy

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

has_many :addresses, :dependent => :destroy

当用户被删除时,他的地址也将被删除。 如果您使用delete操作,回调将不会发生。

  1. User.destroyUser.delete

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

注意:User是一个类,user是一个实例对象。


4
感谢你提及相关记录。 - Sage Mitchell
3
注意:User.destroy_all() 会运行回调函数,在删除任何内容之前,它会加载记录。这是两个 SQL 语句而非一个。除了性能影响外,这还会产生并发问题。更安全的调用方式是跳过回调;User.delete_all() 只会发出单个 DELETE FROM... 命令。 - Andrew Hodgkinson
1
在Rails 5.1中,带有条件的destroy_all已被弃用 - 请参阅https://guides.rubyonrails.org/5_1_release_notes.html。 - Pavel Chuchuva

1

-2
从特定表格中删除一行或从表格中删除记录集非常简单,您只需在控制台中按其ID获取记录集,然后将其删除或销毁即可。

1
只是说没有实际操作来的好,这类问题已经存在了十年之久,很多其他的答案都展示了如何解决。我建议您给其中一个答案点赞,而不是添加一个模糊的附加答案。 - ggorlen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接