@@ -339,11 +339,37 @@ func (s *Storage) GetRuleTemplateDetailByNameAndProjectIds(projectIds []string,
339339 if err == gorm .ErrRecordNotFound {
340340 return t , false , nil
341341 }
342+
343+ // GORM 的 .Preload() 在对关联字段添加条件时,是通过 额外查询 加载子表数据。 它不会对主表(RuleList)做联动过滤,只是关联加载数据,如果子查询没命中,就导致该字段是 nil。
344+ // 清洗无效数据,避免后续 nil 指针
345+ t .RuleList = filterValidRuleList (t .RuleList )
346+ t .CustomRuleList = filterValidCustomRuleList (t .CustomRuleList )
347+
342348 t .RuleList = filterRulesByTag (t .RuleList , tags )
343349 t .CustomRuleList = filterCustomRulesByTag (t .CustomRuleList , tags )
344350 return t , true , errors .New (errors .ConnectStorageError , err )
345351}
346352
353+ func filterValidRuleList (list []RuleTemplateRule ) []RuleTemplateRule {
354+ result := make ([]RuleTemplateRule , 0 , len (list ))
355+ for _ , item := range list {
356+ if item .Rule != nil {
357+ result = append (result , item )
358+ }
359+ }
360+ return result
361+ }
362+
363+ func filterValidCustomRuleList (list []RuleTemplateCustomRule ) []RuleTemplateCustomRule {
364+ result := make ([]RuleTemplateCustomRule , 0 , len (list ))
365+ for _ , item := range list {
366+ if item .CustomRule != nil {
367+ result = append (result , item )
368+ }
369+ }
370+ return result
371+ }
372+
347373func filterRulesByTag (ruleTemplateRules []RuleTemplateRule , tags string ) []RuleTemplateRule {
348374 if tags == "" {
349375 return ruleTemplateRules
0 commit comments