sql - Rails has_many 清除方法

标签 sql ruby-on-rails ruby activerecord has-many

根据documentation Rails has_many 关联有 clear 方法。看起来它在执行后立即执行 sql delete 查询。是否有一种规范的方法可以删除所有子对象并仅在 save 方法时更新关联?例如:

@cart.container_items.delete_all_example # looks like `clear` execute sql at this line
if @cart.save
  # do smth
else
  #do smth
end

这是必要的,因为父对象的许多更改必须全部提交或全部不提交。

最佳答案

你不想delete_all,你想destroy_all

调用 delete_all 执行一个简单的 SQL delete,忽略任何回调和相关记录。

使用 destroy_all 调用每个对象的 destroy 方法,允许 :dependent => :destroy 按预期工作,清理子记录.

不会保存时销毁所有对象,并且没有规范的方法可以做到这一点,因为您没有保存 记录。 Rails 在方法调用时持续销毁,而不是在稍后的 save 中。如果你需要很多销毁是事务性的,将它们包装在一个事务中:

Cart.begin do
  @cart.container_items.delete_all_example
end

关于sql - Rails has_many 清除方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11309555/

相关文章:

ruby-on-rails - Rails事件记录的 'where'方法异常

ruby - 如何使用 rspec 在 sinatra 中测试重定向?

ruby - 重定向到 @timecard 结果为 'no route matches [PATCH] "/timecards"

SQL Server 如果不存在则插入

sql - 从插入语句sql中获取值

php - MySQL根据第一行加载数据

ruby-on-rails - rails : I installed ActiveAdmin and my devise link stopped working

sql - 将记录移动到另一个表与 "flag"列 SQL 性能

ruby-on-rails - Capybara Selenium Chrome 打开 关于 Google Chrome

ruby-on-rails - Rspec 和 capybara ,visit 和 get 方法的区别,关于 current_path 对象