Триггер Apex - объект соединения

пожалуйста, терпите меня, так как я новичок в Apex и триггерах.

У меня есть настраиваемый объект "Конференции". Этот настраиваемый объект является основным для настраиваемого объекта Junction, Junction. Этот объект Junction настроен так, чтобы я мог показывать связанный список контактов стандартного объекта и, таким образом, связывать контакты с конференциями.

Я пытаюсь создать триггер Apex, который будет срабатывать после вставки, обновления, удаления и восстановления контактов, назначенных конференции через объект Junction. Все, что нужно сделать триггеру, - это обновить поле в объекте Conferences, показывающее количество контактов, связанных с конференцией.

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

запускать ConferenceAttendeesUpdater на Junction__c (после вставки, после обновления, после удаления, после восстановления) {

Это похоже на небрежный код, поскольку я думаю, что при чтении в любое время, когда объект соединения обновляется, триггер срабатывает, хотя на самом деле единственный раз, когда это нужно, - это изменение количества контактов. По какой-то причине у меня возникли проблемы с концептуальным пониманием того, какие методы мне понадобятся. Я думаю, он будет включать Junction__c.Contacts.size () для подсчета контактов, назначенных конференции?

Любая помощь будет принята с благодарностью.


person Jesse Brown    schedule 29.07.2017    source источник


Ответы (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();
  }
}
person Matt Kaufman    schedule 31.07.2017