我有这些模型
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工作得很完美......
答案 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_create
和after_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