ruby-on-rails – 设置集合时,ActiveRecord has_many关联不会调用after_destroy

ruby-on-rails – 设置集合时,ActiveRecord has_many关联不会调用after_destroy,第1张

概述3个型号:用户,电影,喜欢 User has_many :likesUser has_many :movies, through: :likes 这段代码: user.movies = [ m1, m2, m3 ] 调用类似#after_create的新的Like记录与用户和m1 / m2 / m3相关.然后,这段代码: user.movies = [ m3, m4 ] 对于将用户与m1 / m 3个型号:用户,电影,喜欢

User has_many :likesUser has_many :movIEs,through: :likes

这段代码:

user.movIEs = [ m1,m2,m3 ]

调用类似#after_create的新的like记录与用户和m1 / m2 / m3相关.然后,这段代码:

user.movIEs = [ m3,m4 ]

对于将用户与m1 / m2相关联的like记录,不会调用like#after_destroy,但会调用like#after_create作为与m4的新关系.

可以手动设置电影集合,也可以使用具有用户[movIE_IDs]复选框的表单进行设置

user.update_attributes(params[:user])

>设置集合的Rails方法是什么?
>如何强制它调用after_destroy?

更新:

正如@jdoe从文档中引用的那样,在分配新集合或从集合中删除时(user.movi​​es.delete(m1))无法实现.唯一的方法是在用户模型上使用before_remove / after_remove回调(如果是多态关系 – 任何其他模型),使用has_many定义:

has_many :movIEs,through: :likes,before_remove: :before_like_destroy,after_remove: after_like_destroydef before_like_destroy(movIE)  like = self.likes.where(movIE_ID: movIE)  # trigger the after_destroy on like  like.trigger_before_destroy # to be implemented on like,should call what the original callbacks containedenddef after_like_destroy(movIE)  # no way to get like object here because it was already removed,need to remember it on the before_destroy somehowend

无法理解它背后的逻辑.它使关系模型的回调完全无用.如果after_create上发生的事情在after_destroy中无法撤消,并且因为更好的做法是将逻辑放在一起之前和之后,而不是单独放置,这会使所有回调都无用.

我想我会写一个自动化的宝石.

解决方法 根据文件:

collection=objects

Replaces the collections content by deleting and adding objects as
appropriate. If the :through option is true callbacks in the join
models are triggered except destroy callbacks,since deletion is direct.

总结

以上是内存溢出为你收集整理的ruby-on-rails – 设置集合时,ActiveRecord has_many关联不会调用after_destroy全部内容,希望文章能够帮你解决ruby-on-rails – 设置集合时,ActiveRecord has_many关联不会调用after_destroy所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1274695.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存