Apex Trigger - Соединительный объект
Пожалуйста, потерпите меня, поскольку я новичок в Apex и триггерах.
У меня есть пользовательский объект, конференции. Этот пользовательский объект является основным для пользовательского объекта Junction, Junction. Этот объект Junction настроен так, чтобы я мог показывать связанный список стандартных объектов Contacts и, таким образом, связывать контакты с Conferences.
Я пытаюсь создать Apex Trigger, который будет срабатывать после вставки, после обновления, после удаления и после восстановления контактов, назначенных для конференции через объект Junction. Все, что нужно сделать триггеру, - это обновить поле в объекте "Конференции", показывающее количество контактов, связанных с конференцией.
Я чувствую, что, должно быть, все усложняю, чем нужно. Я борюсь с моделированием данных для этой задачи - я предполагаю, что мой триггер должен быть на объекте Junction, потому что именно там будет находиться количество контактов, поэтому я предполагаю, что мой код запустится:
вызвать ConferenceAttendeesUpdater на Junction__c (после вставки, после обновления, после удаления, после восстановления) {
Это похоже на неаккуратный код, так как я думаю, что читает каждый раз, когда обновляется объект соединения, триггер сработает, когда на самом деле единственное время, которое ему нужно, это когда количество контактов меняется. По некоторым причинам у меня возникают проблемы с концептуальным пониманием того, какие методы мне понадобятся. Я думаю, что это будет включать Junction__c.Contacts.size() для количества контактов, назначенных для конференции?
Любая помощь будет принята с благодарностью.
1 ответ
Да, если вы хотите посчитать количество записей Junction__c, относящихся к контакту, вы бы поставили триггер на объект Junction__c. Лучше всего размещать свою логику в классе, а не в триггере. Ниже приведена грубая реализация того, что вы хотите.
trigger ConferenceAttendeesUpdater on Junction__c (after insert, after update, after delete, after undelete ) {
if ( Trigger.isAfter && Trigger.isInsert ){
junctionHelper.afterInsert(Trigger.new);
}
if ( Trigger.isAfter && Trigger.isUpdate ){
junctionHelper.afterUpdate(Trigger.new, Trigger.old);
}
if ( Trigger.isAfter && Trigger.isDelete ){
junctionHelper.afterInsert(Trigger.old);
}
if ( Trigger.isAfter && Trigger.isUndelete ){
junctionHelper.afterInsert(Trigger.new);
}
}
public without sharing junctionHelper(){
public static void afterInsert(List<Junction__c> newList){
Map<Id,Contact> contactRollup = new Map<Id,Contact>();
for ( Integer i=0;i<newList[i].size();i++ ){
if ( newList[i].Contact__c != null ){
contactMap.put(newList[i].Contact__c, new Contact(Id=newList[i].Contact__c,Number_of_Junctions__c=0));
}
}
}
public static void afterUpdate(List<Junction__c> newList, List<Junction__c> oldList){
Map<Id,Contact> contactRollup = new Map<Id,Contact>();
for ( Integer i=0;i<newList[i].size();i++ ){
if ( newList[i].Contact__c != oldList[i].Contact__c ){
contactMap.put(newList[i].Contact__c, new Contact(Id=newList[i].Contact__c,Number_of_Junctions__c=0));
}
}
}
public static void rollUpContacts(Map<Id,Contact> contactMap){
for ( AggregateResult ar : [
SELECT COUNT(Id) cnt, Contact__c parentId
FROM Junction__c
WHERE Contact__c IN :contactMap.keySet()
]{
Id parentId = (String)ar.get('parentId);
Decimal cnt = (Decimal)ar.get('cnt');
contactMap.put(parentId,new Contact(Id=parentId,Number_of_Junctions__c=cnt));
}
update contactMap.values();
}
}