我一直在检查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
会删除相关作者。
我误解了以上引用的陈述吗?
答案 0 :(得分:25)
是的,调用delete
通常会跳过你或者铁轨在销毁记录时设置的所有回调。其中包括before_destroy
等回调,也会销毁相关记录。
因此,如果您致电p.delete
,则不会对相关记录执行任何操作。
当您致电p.destroy
时,它会:
before_destroy
回调。:dependent => :delete
,则只会删除Author对象。如果将其设置为:destroy
,它将为作者对象重复此整个过程(如果适用,则回调并销毁其相关记录)。after_destroy
回调。答案 1 :(得分:7)
据我所知:
如果您在对象上调用:dependent => :destroy
, association.destroy
将触发destroy
。
:dependent => :delete
, association.delete
将触发destroy
。
在这两种情况下,您都必须在父对象上调用destroy
。不同之处在于在子对象上调用的方法。如果您不想在子对象上触发销毁过滤器,请使用:dependent => :delete
。如果您确实需要它们,请使用:dependent => :destroy
。
我们看到调用依赖只会在父模型上创建一个after_destroy,在子对象上调用delete
或destroy
。但在这两种情况下,它都会创建一个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。