Подтвердить что ты не робот

Как коснуться отношения HABTM

Если у вас есть 2 модели, видео и категория, и у них есть отношение "has_and_belongs_to_many" друг с другом, как вы можете прикоснуться к недействительности кеша при изменении одного из них?

Вы не можете наносить "касание" на них, как вы можете, с отношением "один ко многим". Теперь, когда я меняю имя категории, видео, принадлежащие к этой категории, не знают об изменении, пока я не сделаю недействительным кеш. Мои шаблоны просмотров показывают название категории для каждого видео.

4b9b3361

Ответ 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 }

Ответ 2

В модели, которую вы хотите обновить, вы можете сделать что-то вроде этого:

class Video < ActiveRecord::Base
  has_and_belongs_to_many :categories,
                          after_add: :touch_updated_at,
                          after_remove: :touch_updated_at

  def touch_updated_at(category)
    self.touch if persisted?
  end

end

Теперь, всякий раз, когда категория добавляется или удаляется из видео, обновляется временная метка video updated_at. Вы можете сделать то же самое в классе категорий, если хотите, чтобы категории обновлялись, когда видео добавлялось или удалялось из них.