要約メールのエントリが複数回繰り返される件

digest suppress tags のサイト設定にタグを追加し、複数のタグを持つトピックを作成することで、ローカルの Discourse サイトで問題を再現することができました。

以下のコードが問題の原因です: discourse/app/models/topic.rb at main · discourse/discourse · GitHub

    if SiteSetting.digest_suppress_tags.present?
      tag_ids = Tag.where_name(SiteSetting.digest_suppress_tags.split("|")).pluck(:id)
      if tag_ids.present?
        topics =
          topics.joins("LEFT JOIN topic_tags tg ON topics.id = tg.topic_id").where(
            "tg.tag_id NOT IN (?) OR tg.tag_id IS NULL",
            tag_ids,
          )
      end
    end

編集: ここで LEFT JOIN が必要だとは思いません。結合された topic_tags テーブルの列は、メソッドの後半では使用されていないようです。修正は次のように簡単なものになる可能性があります。

if SiteSetting.digest_suppress_tags.present?
tag_ids = Tag.where_name(SiteSetting.digest_suppress_tags.split("|")).pluck(:id)
  if tag_ids.present?
  topics =
    topics.where.not(id: TopicTag.where(tag_id: tag_ids).select(:topic_id))
  end
end

最適なアプローチについては、Discourse チームに判断を委ねます。for_digest メソッドは何度も実行されるため、効率的である必要があります。

「いいね!」 4