如何删除ActiveRecord对象?


Answers:


572

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:在Rails 5.1中已弃用@ pavel-chuchuva的注释,destroy_all其中包含条件和delete_all条件-请参阅guides.rubyonrails.org/5_1_release_notes.html


4
如果您可以在答案中包含@hammady的评论,那将是很好的。努力找出为什么我不能销毁我的模型对象...
the_critic


为什么只更新数据库中的delete_at列数据?如何删除整行数据?
TommyQu '17

1
在Rails 5.1中不建议使用带有条件的destroy_all和带条件的delete_all-请参见guides.rubyonrails.org/5_1_release_notes.html
Pavel

User.find_by(username:"bob") 也很容易确定要销毁或删除的记录。
barlop

60

deletedelete_alldestroy,和destroy_all

这些文档是:旧文档Rails 3.0.0文档

delete不会实例化对象,而destroy会实例化。通常,delete速度比快destroy


4
delete更快,但绕过了您可能在模型上定义的回调
Rudi 2015年

48
  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是一个实例对象


3
感谢您解决相关记录。
Sage Mitchell

2
注意:User.destroy_all()运行回调,因此在删除任何内容之前,它会加载记录。这是两个SQL语句,而不是一个。除了对性能的影响外,这也对并发性有影响。安全调用会跳过回调;User.delete_all()只会发出一个DELETE FROM...命令。
安德鲁·霍奇金森

1
有条件的destroy_all已在Rails 5.1中弃用-参见guides.rubyonrails.org/5_1_release_notes.html
Pavel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.