ruby-on-rails – Rails has_many关系中缺少触摸选项

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails has_many关系中缺少触摸选项前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有2个Rails模型:Book和Category,其中一本书属于一个类别,一个类别has_many书籍.

类别名称显示在每本书的页面中,并且页面被缓存.

如果我更改了类别名称(例如,从“科幻”到“科幻小说”),那么所有相应的书页都将过时,并且需要“触摸”书籍才能触发HTML重新生成.

能够这样做似乎是有意义的:

class Category << ActiveRecord::Base
  has_many :books,touch: true
end

但是the option is unavailable,我猜是因为触摸机制会实例化每个对象,这可能会导致has_many关系出现重大性能损失.

为了避免这种情况,我使用原始sql如下:

class Category << ActiveRecord::Base
  has_many :books
  after_update -> {
    ActiveRecord::Base.connection.execute "UPDATE books SET updated_at='#{current_time_string}' WHERE category_id=#{id})"
  }
end

这太可怕了.
有没有更好的办法?

解决方法

你不能使用touch on has_many关联,它只适用于belongs_to,这是事实.

如果我正确理解了您想要的内容,那么Book模型中的touch:true的答案将无效,因为当您更改Category模型并且视图不会重新生成时,Book对象将不会更新.

所以我认为你的解决方案是最好的. (你也可以使用books.update_all(updated_at:Time.now))

原文链接:https://www.f2er.com/ruby/264628.html

猜你在找的Ruby相关文章