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

ruby-on-rails – 如何触及HABTM关系

发布时间:2020-12-16 20:14:21 所属栏目:百科 来源:网络整理
导读:如果您有两个模型,视频和类别,并且它们之间具有“has_and_belongs_to_many”关系,那么当其中一个更改时,如何执行触摸来使缓存失效? 你不能像“一对多”关系那样对他们进行“触摸”.现在,当我更改类别名称时,属于该类别的视频在使缓存无效之前不知道更改.我
如果您有两个模型,视频和类别,并且它们之间具有“has_and_belongs_to_many”关系,那么当其中一个更改时,如何执行触摸来使缓存失效?

你不能像“一对多”关系那样对他们进行“触摸”.现在,当我更改类别名称时,属于该类别的视频在使缓存无效之前不知道更改.我的视图模板显示每个视频的类别名称.

解决方法

触摸只能在两种情况下使用.

记录在案

category = Category.first
category.touch

关于belongs_to关系

belongs_to :category,:touch => true

所以如果你想使用它与HABTM关系,恐怕你必须手动做.它可能是这样的:

class Category
  before_save :touch_videos

  def touch_videos
    videos.touch
  end
end

class Video
  def self.touch
    update_attributes(:updated_at => Time.now)
    # or
    each { |video| video.touch } # Make a proper touch
  end
end

请注意,如果您想允许视频触摸类别,则必须找到避免“循环”更新的方法.

每个& find_each

如果您喜欢使用update_attributes,请使用find_each批量加载记录.这将避免在内存中同时加载所有记录,并可能导致应用程序崩溃.如果您没有10k的记录,您可能看不到任何差异,但是随着您的表格的增长,如果您使用每个记录,它将变慢或甚至破裂.

find_each(batch_size: 2000) { |video| video.touch }

(编辑:李大同)

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

    推荐文章
      热点阅读