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();
  }
}
Другие вопросы по тегам