Apex 触发器触发来自自定义元数据的动态引用字段

Apex trigger firing on dynamically referenced fields from Custom Metadata

我在尝试这个当前问题时 运行 陷入了技能墙。我有一个自定义对象 (Acq__c),上面有一系列供用户查找的字段。当更新这些字段时,特定的相关子对象也会更新以反映关联的新用户。这个初始部分很好。但是,需要能够扩展此功能所适用的领域。因此,如果构建了一个新的 LookUp 字段 - 它可以很容易地被授予相同的功能。我希望通过使用自定义元数据类型来做到这一点。在这种情况下,控制更新功能的触发器将查询自定义元数据类型记录,找到 Acq__c 对象上应该具有此更新功能的所有字段,测试它们是否已在 DML 语句中更新,然后根据更新的内容适当地触发。这将允许任何用户在将来创建新查找,将它们添加到 Acq__c 对象,然后更新元数据以将触发器扩展到新字段。

触发器、更新等的直接部分 - 我没有任何问题。一旦我查询自定义元数据并获得一个记录列表,每个记录列表都包含 Acq__c 对象上的字段的 API - 我不确定如何使用此记录列表来查看已更新的字段,然后相应地需要触发子对象更新。

我希望所有这些都有意义 - 任何帮助都将不胜感激。

N

自定义元数据可能有点过头了,看看 fieldsets?它们现在有点过时了(它们在 Visualforce 页面中非常有用,在 LWC 中没那么有用)但仍然 - 它们会“更靠近”被更改的对象,更有可能管理员不会忘记更改它们。

获得字段 API 名称的列表(或集合)后,您可以遍历 trigger.new。类似的东西

Set<String> watchedFields = new Set<String>();
for(Schema.FieldSetMember fsm : sObjectType.Acq__c.FieldSets.MyFieldsetNameHere.getFields()){
    watchedFields.add(fsm.getFieldPath());
}
System.debug(watchedFields);
Map<Id, Acq__c> recordsWithKeyFieldsChanged = new Map<Id, Acq__c>();

for(Acq__c acq : trigger.new){
    Acq__c old = trigger.oldMap.get(acq.Id);
    for(String field : watchedFields){
        if(acq.get(field) != old.get(field)){
            recordsWithKeyFieldsChanged.add(acq);
            break;
        }
    }
}
System.debug(recordsWithKeyFieldsChanged);
if(!recordsWithKeyFieldsChanged.isEmpty()){
    doSomething(recordsWithKeyFieldsChanged);
}

它是一个循环中的循环,所以不是很好,但是如果不编写一个巨大的硬编码 if 语句就很难做到这一点。最坏的情况是什么,200 条记录乘以多少字段? ~10?限制是 40 个“自定义关系字段”,所以不是世界末日。