ruby-on-rails – 设置集合时,ActiveRecord has_many关联不会调
3个型号:用户,电影,喜欢
User has_many :likes User 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方法是什么? 更新: 正如@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_destroy def 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 contained end def after_like_destroy(movie) # no way to get Like object here because it was already removed,need to remember it on the before_destroy somehow end 无法理解它背后的逻辑.它使关系模型的回调完全无用.如果after_create上发生的事情在after_destroy中无法撤消,并且因为更好的做法是将逻辑放在一起之前和之后,而不是单独放置,这会使所有回调都无用. 我想我会写一个自动化的宝石. 解决方法
根据文件:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |