Вызваны ли обратные вызовы ActiveRecord в таблице соединений в отношении HABTM? - PullRequest
1 голос
/ 01 февраля 2012

Во время тестирования 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

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

В исходном коде видно, что все акты act_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 Ответ

0 голосов
/ 20 апреля 2017

Обратные вызовы ассоциации 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 выдает исключение, объект не будет удален из коллекции.

...