Проблемы с has_many: through, cache, touch и counter_cache - PullRequest
4 голосов
/ 20 августа 2010

У меня много has_many: через отношения в моем приложении.Я показываю информацию, связанную с этим, например количество подключенных объектов.Всякий раз, когда пользователь обновляет отношение, таблица присоединения изменяется, и я могу поймать это на своих Sweepers.

Проблема заключается в том, что записи таблицы присоединения удалены , а не уничтожены .Если связь исчезла, у меня нет разумного способа обнаружить это, и я отображаю вводящую в заблуждение информацию из кэша.Все как: touch => true или: counter_cache => true работает частично.Это увеличивается, если отношения обновляются или создаются.Но если пользователь удаляет связь, ничего не происходит.: counter_cache не работает,: touch не срабатывает.

Мусорным решением является вызов .touch в контроллере, когда сохраняется основная модель.Этот вид работает, но, кажется, действительно непрофессионально.Это должно быть в логике модели, а не в контроллерах.

Я чувствую, что упускаю что-то большое, но не могу понять это.Кто-нибудь мог бы пролить свет на эту проблему?

Ответы [ 2 ]

1 голос
/ 19 февраля 2013

Исправление обезьяны Активная запись не требуется.При определении вашей ассоциации установите для параметра :dependent значение :destroy.

class Book < ActiveRecord::Base
  has_many :authorships, :dependent => :destroy
  has_many :authors, :through => :authorships, :dependent => :destroy
end
.
0 голосов
/ 07 декабря 2010

Проверьте исправление, которое Марк С. написал для ответа на свой вопрос: Как создать полный журнал аудита в Rails для каждой таблицы?

ActiveRecord::Associations::HasManyThroughAssociation.class_eval do 
  def delete_records(records)
    klass = @reflection.through_reflection.klass
    records.each do |associate|
      klass.destroy_all(construct_join_attributes(associate))
    end
  end
end

Это может быть полезно и для вашей проблемы. Обратите внимание, что это было в Rails 2 .. все может быть иначе, если вы уже используете Rails 3.

...