ChatGPT解决这个技术问题 Extra ChatGPT

如何删除 ActiveRecord 对象?

如何删除 ActiveRecord 对象?

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

按 id 删除,删除当前对象如:user.remove,可以根据 where 子句删除吗?


Q
Qortex

它是 destroydestroy_all 方法,例如

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

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

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 的评论,那就太好了。努力找出为什么我不能破坏我的模型对象......
为什么它只更新数据库中的 deleted_at 列数据?如何删除整行数据?
在 Rails 5.1 中不推荐使用带有条件的destroy_all 和带有条件的delete_all - 请参阅guides.rubyonrails.org/5_1_release_notes.html
这个 User.find_by(username:"bob") 也可以很好地识别要销毁或删除的记录。
C
Community

deletedelete_alldestroydestroy_all

文档是:older docsRails 3.0.0 docs

delete 不会实例化对象,而 destroy 会。通常,deletedestroy 快。


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

用户销毁

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

has_many :addresses, :dependent => :destroy

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

User.destroy、User.delete User.destroy_all() 或 User.delete_all()

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


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

如果您使用的是 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


M
Martins

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