为什么尝试在delete_all
的实例上调用destroy_all
或ActiveRecord::Associations::CollectionProxy
并传递条件时,会抛出ArgumentError: Valid values are :nullify or :delete_all
错误,而{ {1}}不是吗?
在尝试ActiveRecord::Relation#delete_all
时,如果delete_all
和Movies
之间可能存在关系,则会出现这种情况。在这种情况下,给定Actors
实例,可能需要执行以下操作:
Movie
以上不起作用,抛出错误。
他们的对手movie.actors.delete_all(id: [2,3,4])
也是如此。
答案 0 :(得分:2)
尽管有一个老问题我以为我会回答。
ActiveRecord :: Relation和ActiveRecord ::关联的工作方式不同,可能很烦人。虽然使用destroy来确保你没有一个满是孤儿的数据库,但它们非常有用。
回到你想要做的事情。
使用活动记录删除数据数组:
不要这样做:(此代码不正确)
删除已返回的数组
返回特定问题
此代码不正确
这里的问题是你使用AR关联返回一个数据数组然后在该数据上调用.delete_all(然后希望delete_all的args将作为一个SQL类型WHERE IN。遗憾的是AR不是这样工作的。)
正确的方法
其中args会像[movie:'titanic',id:1,2,3]
我希望这有助于将来阅读本文。使用带关联的删除时要非常小心,因为Active Record会自动杀死孤儿数据。如果您不确定,删除是更安全的选择。
答案 1 :(得分:1)
虽然看起来他们应该表现得相同,并且遵循最少惊喜的原则,但实际上表现得非常惊人和不同:
ActiveRecord::CollectionProxy#delete_all
及其对应的#destroy_all
将dependent
参数作为参数,其默认值为nil
。这与ActiveRecord::Relation#delete_all
的工作原理非常不同,后者采用一组条件,例如可以传递给ActiveRecord::Base
的子类的条件。
因此,考虑到上面的Actor
模型,可以这样做:
Actor.delete_all(id: [2,3,4])
但是,有人可能无法通过associatino代理获取Movie's
个关联的Actor
记录,然后在其上调用delete_all
。