加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 02:18:19 所属栏目:百科 来源:网络整理
导读: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
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方法是什么?
>如何强制它调用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_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中无法撤消,并且因为更好的做法是将逻辑放在一起之前和之后,而不是单独放置,这会使所有回调都无用.

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

解决方法

根据文件:

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读