依赖性破坏不起作用

时间:2015-02-18 10:50:52

标签: ruby-on-rails ruby-on-rails-4

我试图使用依赖::破坏但没有成功。

让我们举一个简单的例子。我用以下内容创建了一个简单的应用程序:

rails g model parent
rails g model child parent:references

将以下行添加到parent.rb

has_many :children, dependent: :destroy

我在rails console(rails c)中进行了以下测试

p = Parent.create!
c = Child.create!
c.parent = p
c.save
#check association
Child.first == Child.first.parent.children.first
p.delete
#This should return 0
Child.count == 0

Child.count返回1.

我失踪了什么?

由于

2 个答案:

答案 0 :(得分:18)

4.2.2.4 :dependent

如果您将:dependent选项设置为:

  • :destroy,当对象被销毁时,将在其关联对象上调用#destroy
  • :delete,当对象被销毁时,所有关联的对象将直接从数据库中删除而不用调用他们的#destroy方法。

根据您的设置,您必须执行p.destroy

The :dependent选项可以具有不同的值,用于指定删除的完成方式。有关更多信息,请参阅有关此选项的文档,了解不同的特定关联类型。当没有给出选项时,在销毁记录时,行为是对相关记录不采取任何行动。

对于has_manydestroydestroy_all将始终调用正在删除的记录的destroy方法,以便运行回调。但是deletedelete_all会根据:dependent选项指定的策略进行删除,或者如果没有给出:dependent选项,然后它将遵循默认策略。默认策略为:nullify将外键设置为nil ),has_many :through除外,其中默认策略为delete_all(删除连接记录,没有运行他们的回调)。

答案 1 :(得分:5)

在ActiveRecord派生对象上调用delete方法将对数据库发出直接DELETE语句,跳过任何ActiveRecord回调和配置,例如dependent: destroy

我相信你想要destroy方法。

您还可以在数据库中设置外键并将其设置为在删除时级联,这可能是有意义的,具体取决于您的需要。