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

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

发布时间:2020-12-16 23:27:30 所属栏目:百科 来源:网络整理
导读:我有2个Rails模型:Book和Category,其中一本书属于一个类别,一个类别has_many书籍. 类别名称显示在每本书的页面中,并且页面被缓存. 如果我更改了类别名称(例如,从“科幻”到“科幻小说”),那么所有相应的书页都将过时,并且需要“触摸”书籍才能触发HTML重新
我有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))

(编辑:李大同)

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

    推荐文章
      热点阅读