【发布时间】:2011-05-09 19:50:06
【问题描述】:
如何删除 ActiveRecord 对象?
我查看了Active Record Querying,它没有任何可以删除的内容。
由
id删除,删除当前对象如:
user.remove,可以根据
where子句删除吗?
【问题讨论】:
标签: ruby-on-rails rails-activerecord
如何删除 ActiveRecord 对象?
我查看了Active Record Querying,它没有任何可以删除的内容。
由id删除,
删除当前对象如:user.remove,
可以根据where 子句删除吗?
【问题讨论】:
标签: ruby-on-rails rails-activerecord
是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 的评论,destroy_all with conditions 和 delete_all with conditions 在 Rails 5.1 中已被弃用 - 请参阅 guides.rubyonrails.org/5_1_release_notes.html
【讨论】:
User.find_by(username:"bob") 也可以很好地识别要销毁或删除的记录。
User.destroyUser.destroy(1) 将删除带有id == 1 和:before_destroy 和:after_destroy 回调的用户。例如,如果您有关联的记录
has_many :addresses, :dependent => :destroy
用户被销毁后,他的地址也将被销毁。 如果你改用删除操作,回调将不会发生。
User.destroy, User.delete
User.destroy_all(<conditions>) 或User.delete_all(<conditions>)
注意:用户是一个类,用户是一个实例对象
【讨论】:
User.destroy_all() 运行回调,因此在删除任何内容之前,它会加载记录。这是两条 SQL 语句,而不是一条。除了性能影响之外,这也有并发影响。更安全的调用跳过回调; User.delete_all() 将只发出一个 DELETE FROM... 命令。
有delete、delete_all、destroy和destroy_all。
文档是:older docs 和 Rails 3.0.0 docs
delete 不会实例化对象,而destroy 会。一般来说,delete 比 destroy 快。
【讨论】:
delete 更快,但会绕过您可能在模型上定义的回调
如果您使用的是 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 获取记录集,然后删除或销毁它。
【讨论】: