如何删除ActiveRecord对象?

我查看了Active Record查询,但删除后却没有任何内容。


id删除,
删除当前对象,例如:user.remove
可以基于where子句删除吗?


#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的评论来看,Rails 5.1中已弃用带条件的destroy_all和带条件的delete_all-请参见guides.rubyonrails.org/5_1_release_notes.html

评论


如果您可以在答案中包含@hammady的评论,那就太好了。努力找出为什么我无法销毁我的模型对象...

–the_critic
16年5月26日在15:44

stackoverflow.com/questions/2978219/…

–the_critic
16年5月26日在16:41

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

–TommyQu
17-9-28 17:42



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

– Pavel Chuchuva
19年1月10日在20:30



这个User.find_by(username:“ bob”)也很适合标识要销毁或删除的记录。

– barlop
19年4月1日在18:14

#2 楼

deletedelete_alldestroydestroy_all
文档是:较旧的文档和Rails 3.0.0文档。
delete不会实例化对象,而destroy可以实例化对象。通常,deletedestroy快。

评论


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

–鲁迪
2015年10月17日19:39

#3 楼


User.destroy

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

has_many :addresses, :dependent => :destroy


用户被销毁后,其地址也将被销毁。
如果使用delete动作,则不会发生回调。


User.destroyUser.delete
User.destroy_all(<conditions>)User.delete_all(<conditions>)

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

评论


感谢您解决相关记录。

– Sage Mitchell
2012年11月14日15:26

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

–安德鲁·霍奇金森(Andrew Hodgkinson)
2015年11月11日,下午1:48

有条件的destroy_all已在Rails 5.1中弃用-参见guides.rubyonrails.org/5_1_release_notes.html

– Pavel Chuchuva
19年1月10日在20:29

#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