ruby на рельсах after_remove, обратные вызовы after_add для has_many: через - PullRequest
6 голосов
/ 06 июня 2011

У меня есть модель, которая подходит по следующей схеме:

class foo < ActiveRecord::Base

  has_many :bar, :dependent => :destroy

  has_many :baz, :through => :bar, :uniq => true,
    :after_add => :update_baz_count,
    :after_remove => :update_baz_count

  def update_baz_count(record)
    debugger
    # stuff...
  end
end

Я пытаюсь сохранить количество уникальных баз, связанных с foo через bar. Но по какой-то причине обратные вызовы after_add и after_remove никогда не вызываются, когда я добавляю бар (который должен иметь базу) в foo. Есть идеи почему? Я использовал эти обратные вызовы с habtm, и они отлично работают.

Спасибо.

Ответы [ 2 ]

6 голосов
/ 03 января 2013

Обратите внимание, что after_destroy обратные вызовы не будут запускаться на ассоциированном объекте при использовании has_many :through

Из документации по рельсам:

Если опция: through является истинным обратным вызовамМодели объединения запускаются, за исключением разрушающих обратных вызовов, поскольку удаление является прямым.

Вы должны придерживаться добавления / удаления обратных вызовов, просто убедитесь, что вы объявляете ассоциацию только один раз.

5 голосов
/ 06 июня 2011

Это не работает, потому что вы создаете ассоциацию баров, и к ней не добавляются обратные вызовы. Я бы сделал это с методами after_create и after_destroy в классе bar. Таким образом, они будут запускать любой возможный способ, которым вы создадите ассоциацию.

#in Bar class
after_create :update_foo_baz_count
after_destroy :update_foo_baz_count

def update_foo_baz_count
  self.foo.update_baz_count
end
...