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