我查看了Active Record查询,但删除后却没有任何内容。
id
删除,删除当前对象,例如:
user.remove
,可以基于
where
子句删除吗?#1 楼
它是destroy
和destroy_all
方法,例如user.destroy
User.find(15).destroy
User.destroy(15)
User.where(age: 20).destroy_all
User.destroy_all(age: 20)
或者,您可以使用
delete
和delete_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 #2 楼
有delete
,delete_all
,destroy
和destroy_all
。文档是:较旧的文档和Rails 3.0.0文档。
delete
不会实例化对象,而destroy
可以实例化对象。通常,delete
比destroy
快。评论
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.destroy
,User.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
评论
如果您可以在答案中包含@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