如果您有两个模型,视频和类别,并且它们之间具有“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 }