如何删除 ActiveRecord 对象?
我查看了 Active Record Querying,它没有任何我可以看到的删除内容。
按 id 删除,删除当前对象如:user.remove,可以根据 where 子句删除吗?
它是 destroy
和 destroy_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
回调或任何相关关联选项的 delete
和 delete_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
有 delete
、delete_all
、destroy
和 destroy_all
。
文档是:older docs 和 Rails 3.0.0 docs
delete
不会实例化对象,而 destroy
会。通常,delete
比 destroy
快。
delete
更快,但会绕过您可能在模型上定义的回调
用户销毁
User.destroy(1)
将删除用户,并发生 id == 1
和 :before_destroy
和 :after_destroy
回调。例如,如果您有关联的记录
has_many :addresses, :dependent => :destroy
用户被销毁后,他的地址也将被销毁。如果您改用删除操作,则不会发生回调。
User.destroy、User.delete User.destroy_all(
注意:用户是一个类,用户是一个实例对象
User.destroy_all()
运行回调,因此在删除任何内容之前,它会加载记录。这是两条 SQL 语句,而不是一条。除了性能影响之外,这也有并发影响。更安全的调用跳过回调; User.delete_all()
将只发出一个 DELETE FROM...
命令。
如果您使用的是 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
从特定表中删除一行或从表中删除记录集非常简单,您只需在控制台中按其 ID 获取记录集,然后删除或销毁它。
User.find_by(username:"bob")
也可以很好地识别要销毁或删除的记录。