Вызваны ли обратные вызовы ActiveRecord в таблице соединений в отношении HABTM?

При тестировании acts_as_audited я обнаружил (как также описано здесь), что флаг:with_associations не создает записи таблицы аудита для отношений HABTM.

Например:

User < ActiveRecord::Base
  has_and_belongs_to_many: :groups
  acts_as_audited, with_associations: groups

Group < ActiveRecord::Base
  has_and_belongs_to_many: :users
  acts_as_audited, with_associations: users

(и проверенные варианты, т.е. с / без ассоциаций)

В исходном коде видно, что все акты activ_as_audited добавляет обратные вызовы, такие как before_update и after_create, в проверенные таблицы. Очевидно, они не добавляются в таблицы соединений.

Я пытался сделать модель, как:

GroupsUsers < ActiveRecord::Base
  acts_as_audited

  after_save: :test

  def test
    logger.debug "test"
  end

но не увидел каких-либо дополнений в таблице аудита для операций CRUD над пользователями или группами. Я вижу оператор SQL, который действует в таблице соединений в журналах, поэтому это говорит о том, что таблица соединений изменяется внутри системы таким образом, что обычные обратные вызовы игнорируются.

Это правда? Какие-либо предложения для того, чтобы актов act_as_audited, чтобы заметить таблицу соединений или зарегистрировать ассоциации HABTM?

1 ответ

Ассоциация обратных вызовов has_and_belongs_to_many

Подобно обычным обратным вызовам, которые подключаются к жизненному циклу объекта Active Record, вы также можете определить обратные вызовы, которые запускаются при добавлении объекта или удалении объекта из коллекции ассоциаций.

class Project
  has_and_belongs_to_many :developers, after_add: :evaluate_velocity

  def evaluate_velocity(developer)
    ...
  end
end

Можно составлять обратные вызовы, передавая их в виде массива. Пример:

class Project
  has_and_belongs_to_many :developers,
                          after_add: [:evaluate_velocity, Proc.new { |p, d| p.shipping_date = Time.now}]
end

Возможные обратные вызовы: before_add, after_add, before_remove а также after_remove,

Если какой-либо из before_add обратные вызовы выдают исключение, объект не будет добавлен в коллекцию.

Точно так же, если любой из before_remove обратные вызовы выдают исключение, объект не будет удален из коллекции.

Другие вопросы по тегам