Ответ 1
Touch можно использовать только в двух случаях.
В записи
category = Category.first
category.touch
В отношении 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
Помните, что если вы хотите, чтобы Video также касался категорий, вам нужно найти способ избежать "круговых" обновлений.
каждый и find_each
Если вы предпочитаете каждый из атрибутов update_attributes, используйте find_each для загрузки записей в пакетном режиме. Это позволит избежать загрузки всех записей одновременно в памяти и потенциально свернуть приложение. Если у вас нет записей 10k, вы, вероятно, не увидите никакой разницы, но по мере роста вашей таблицы она будет замедляться или даже ломаться, если вы будете использовать каждый.
find_each(batch_size: 2000) { |video| video.touch }