after_destroy没有调用链表

时间:2016-11-18 15:58:47

标签: ruby-on-rails rails-activerecord

我有这些模型

npm install angular2-fullcalendar --save

链接表的模型:

class User < ActiveRecord::Base
  has_many :user_functions, :dependent => :destroy
  has_many :functions, :through => :user_functions
  accepts_nested_attributes_for :functions, allow_destroy: true

当然还有功能模型,但这就像用户......

现在,当我在测试中执行以下操作时:

class UserFunction < ActiveRecord::Base
  belongs_to :user, inverse_of: :user_functions
  belongs_to :function, inverse_of: :user_functions
  after_destroy :unplan_items
  after_create :plan_items

我注意到没有调用回调after_destroy。为什么这样,我怎么能避免这种情况。每次销毁UserFunction时都需要执行某些步骤......

我认为这与:https://github.com/rails/rails/issues/7618(我使用的是rails 4.2.5)有关。 after_create工作得很完美......

2 个答案:

答案 0 :(得分:3)

目前rails使用:delete_all作为has_many_through的默认策略。当我们在关联上明确指定:destroy_all时,它只会调用dependent: :destroy

如果您需要回调,文档会提及使用has_many :through的建议:    请参阅此处的建议:http://guides.rubyonrails.org/association_basics.html

  

你应该使用has_many:through如果你需要验证,回调,   或连接模型上的额外属性。

因此,执行回调的after_createafter_destroy之间目前存在不一致。

在GitHub上发布的这两个问题中提到了这一点:

https://github.com/rails/rails/issues/7618

https://github.com/rails/rails/issues/27099

现在的解决方法是明确将:dependent => :destroy放在:through部分。这将确保使用回调。

class User < ActiveRecord::Base
  has_many :user_functions
  has_many :functions, :through => :user_functions, :dependent => :destroy
  accepts_nested_attributes_for :functions, allow_destroy: true

答案 1 :(得分:0)

对于阅读此 2021+ 的任何人

改变这个

has_many :object_tags, :as => :taggable, :dependent => :destroy
has_many :tags, :through => :object_tags

到这里

has_many :object_tags
has_many :tags, :through => :object_tags, :dependent => :destroy