如何删除ActiveRecord对象?
我查阅了Active Record查询指南,但没有找到关于删除的内容。
通过
id
进行删除,像这样删除当前对象:
user.remove
,能否基于
where
子句进行删除?
如何删除ActiveRecord对象?
我查阅了Active Record查询指南,但没有找到关于删除的内容。
通过 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)
或者你可以使用 delete
和 delete_all
,它们不会强制执行:before_destroy
和 :after_destroy
回调函数或任何依赖关联选项。
User.delete_all(condition: 'value')
允许您删除没有主键的记录
注意:根据@hammady的评论,如果User模型没有主键,则user.destroy
将无法工作。
注意2:根据@pavel-chuchuva的评论,带有条件的destroy_all
和带有条件的delete_all
已在Rails 5.1中弃用-请参见guides.rubyonrails.org/5_1_release_notes.html
有 delete
, delete_all
, destroy
, 和 destroy_all
.
文档链接分别为: 旧版文档 和 Rails 3.0.0 版本文档
delete
不会实例化对象,destroy
会。通常来说,delete
比 destroy
更快速。
delete
操作更快,但会绕过您在模型上定义的回调函数。 - RudiUser.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>
)
注意:User是一个类,user是一个实例对象。
User.destroy_all()
会运行回调函数,在删除任何内容之前,它会加载记录。这是两个 SQL 语句而非一个。除了性能影响外,这还会产生并发问题。更安全的调用方式是跳过回调;User.delete_all()
只会发出单个 DELETE FROM...
命令。 - Andrew Hodgkinson#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
User.find_by(username:"bob")
也可以用来识别要删除的记录。 - barlop