:dependent => :belongs_to上的删除不会删除所有者对象

时间:2012-09-17 11:55:18

标签: ruby-on-rails ruby-on-rails-3 activerecord

我一直在检查belongs_to方法的选项并测试Rails 3.2.7中的以下行为

根据上述链接,:dependent选项指出

  

如果设置为:destroy,则在此时销毁关联的对象   对象是。如果设置为:delete,则删除关联的对象   调用它的destroy方法。

据我了解,如果在以下情况下删除帖子,则应删除作者:

class Post < ActiveRecord::Base
  belongs_to :author, :dependent => :delete
end

class Author < ActiveRecord::Base
  attr_accessible :name
  has_one :post

  before_destroy :log_author_removal

  private
    def log_author_removal
      logger.error('Author is getting removed')
    end

end

在控制台中:

> Post.first
  Post Load (0.4ms)  SELECT "posts".* FROM "posts" LIMIT 1
 => #<Post id: 5, title: "Post 5", author_id: 3>
> p.delete
  SQL (197.7ms)  DELETE FROM "posts" WHERE "posts"."id" = 5
 => #<Post id: 5, title: "Post 5", author_id: 3> 
> Author.find(3)
  Author Load (0.5ms)  SELECT "authors".* FROM "authors" WHERE "authors"."id" = ? LIMIT 1  [["id", 3]]
 => #<Author id: 3, name: "Author 3"> 

但是,调用p.destroy会删除相关作者。

我误解了以上引用的陈述吗?

5 个答案:

答案 0 :(得分:25)

是的,调用delete通常会跳过你或者铁轨在销毁记录时设置的所有回调。其中包括before_destroy等回调,也会销毁相关记录。

因此,如果您致电p.delete,则不会对相关记录执行任何操作。

当您致电p.destroy时,它会:

  1. 如果设置,请调用before_destroy回调。
  2. 删除对象。
  3. 如果设置:dependent => :delete,则只会删除Author对象。如果将其设置为:destroy,它将为作者对象重复此整个过程(如果适用,则回调并销毁其相关记录)。
  4. 如果设置,请调用after_destroy回调。

答案 1 :(得分:7)

据我所知:

如果您在对象上调用:dependent => :destroy

association.destroy将触发destroy

如果您在对象上调用:dependent => :delete

association.delete将触发destroy

在这两种情况下,您都必须在父对象上调用destroy。不同之处在于在子对象上调用的方法。如果您不想在子对象上触发销毁过滤器,请使用:dependent => :delete。如果您确实需要它们,请使用:dependent => :destroy

快速查看来源:https://github.com/rails/rails/blob/357e288f4470f484ecd500954fd17fba2512c416/activerecord/lib/active_record/associations/builder/belongs_to.rb#L68

我们看到调用依赖只会在父模型上创建一个after_destroy,在子对象上调用deletedestroy。但在这两种情况下,它都会创建一个after_destroy

答案 2 :(得分:2)

对于:依赖

belongs_to association支持:删除:销毁。 你可以参考下面的链接 http://apidock.com/rails/v4.0.2/ActiveRecord/Associations/ClassMethods/belongs_to

调用delete会跳过像before_destroy这样的所有回调,并且也不会删除关联对象的关联记录。

实施例

class Order < ActiveRecord::Base
has_one :project, :dependent => :delete
has_many :resources, :dependent => :delete
end

class Project < ActiveRecord::Base
belongs_to :order, :dependent => :delete
end

在上面的代码中,如果项目已被销毁,那么订单也将被删除,但顺序中的资源将不会被删除 但如果我们使用

belongs_to :order, :dependent => :destroy

然后附带订单的资源以及项目销毁时删除。

答案 3 :(得分:1)

 belongs_to :author, :dependent => :delete

应该是:      belongs_to:author,:dependent =&gt; :破坏

:destroy和:delete在ActiveRecord中表现不同,删除旁路验证和AR关联,因此不会删除关联的对象。

答案 4 :(得分:-1)

belongs_to association不支持:依赖:删除。它仅支持:destroy 。请参阅此链接http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

相关问题