Ruby on rails Rails中缺少触摸选项有很多关系

Ruby on rails Rails中缺少触摸选项有很多关系,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有两个Rails模型:Book和Category,其中一本书属于一个类别,一个类别有很多书 类别名称显示在每本书的页面中,页面被缓存 如果我更改类别名称(例如,从“Sci-Fi”更改为“Sci-Fi”),那么所有相应的书籍页面都将过时,需要“触摸”书籍以触发HTML重新生成 能够做到以下几点似乎是有意义的: class Category << ActiveRecord::Base has_many :books, touch: true end 这太可怕了。 有更好的方法吗?

我有两个Rails模型:Book和Category,其中一本书
属于一个类别,一个类别
有很多书

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

如果我更改类别名称(例如,从“Sci-Fi”更改为“Sci-Fi”),那么所有相应的书籍页面都将过时,需要“触摸”书籍以触发HTML重新生成

能够做到以下几点似乎是有意义的:

class Category << ActiveRecord::Base
  has_many :books, touch: true
end
这太可怕了。
有更好的方法吗?

它仅在您的图书模型中的
属于
方法上可用。所以你仍然可以使用它。

你不能在
上使用
touch
有很多关联,它只能与
所属的
一起使用,这是事实

如果我正确理解了您想要的内容,那么图书模型中带有
touch:true
的答案将不起作用,因为当您更改类别模型时,图书对象不会更新,视图也不会重新生成


所以我认为你的解决方案是最好的。(您也可以使用
books.update\u all(更新时间:Time.now)

从Rails 6开始,ActiveRecord::Relation上有一个touch\u all方法,可以通过一个查询处理这类事情。这上面有一篇很好的博客文章。

Lol,同时回答,另一个答案有更好的解释:)。你在两个方面都是对的:1)当一个类别改变时,我确实需要改变所有的书;2) update_all更简单,不实例化模型;直接发送到数据库的SQL查询避免了性能问题。请注意,
update\u all
不会触发ActiveRecord回调。因此,如果你的图书模型有另一个
属于。。。touch:true
关系,该触摸不会发生。您还需要手动触发。
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