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

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 如何触及HABTM关系前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果您有两个模型,视频和类别,并且它们之间具有“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 }

猜你在找的Ruby相关文章