zea*_*ker 1 activerecord ruby-on-rails
为什么当尝试在 的实例上调用delete_allor并传递条件时,会抛出错误,而不会?destroy_allActiveRecord::Associations::CollectionProxyArgumentError: Valid values are :nullify or :delete_allActiveRecord::Relation#delete_all
例如,当尝试给定一种关系(例如和 之间delete_all可能存在)时,就会出现这种情况。在这种情况下,给定一个实例,人们可能想做类似的事情:MoviesActorsMovie
movie.actors.delete_all(id: [2,3,4])
上面的方法不起作用,抛出错误。
他们的对手也是如此#destroy_all。
尽管是老问题,但我想我会放弃答案。
ActiveRecord::Relation并且ActiveRecord::Associations工作方式不同并且可能会很烦人。不过,当使用 destroy 来确保数据库中没有充满孤儿时,它们非常有用。
这又回到了你想要做的事情。
要使用活动记录删除数据数组:
YourApplication::Models::YourClass.destroy_all(selector: value)
Run Code Online (Sandbox Code Playgroud)
不要这样做:(此代码不正确)
YourApplication::Models::YourClass.find(selector: value).destroy_all
Run Code Online (Sandbox Code Playgroud)
删除已经返回的数组
data_to_delete = YourApplication::Models::YourClass.find(selector: value).destroy_all
data_to_delete.each(&:destroy)
Run Code Online (Sandbox Code Playgroud)
回到具体问题
此代码不正确
movie.actors.delete_all(id: [2,3,4])
Run Code Online (Sandbox Code Playgroud)
这里的问题是你使用 AR 关联返回一个数据数组,然后对该数据调用 .delete_all (然后希望 delete_all 的参数将充当 SQL 类型 WHERE IN。遗憾的是,这不是 AR 的工作方式。)
执行此操作的正确方法
actors.delete_all(args)
Run Code Online (Sandbox Code Playgroud)
args 会是这样的movie: 'titanic', id: [1,2,3]
我希望这对将来阅读本文的人有所帮助。使用关联删除时要非常小心,因为 Active Record 会自动删除孤立数据。如果您不确定,删除是更安全的选择。
| 归档时间: |
|
| 查看次数: |
2283 次 |
| 最近记录: |