module Mentions extend ActiveSupport::Concern included do has_many :mentions, as: :source, dependent: :destroy has_many :mentionees, through: :mentions after_save_commit :create_mentions_later, if: :should_create_mentions? end def create_mentions(mentioner: Current.user) scan_mentionees.each do |mentionee| mentionee.mentioned_by mentioner, at: self end end def mentionable_content rich_text_associations.collect { send(it.name)&.to_plain_text }.compact.join(" ") end private def scan_mentionees mentionees_from_plain_text | mentionees_from_rich_text end def mentionees_from_plain_text scan_mentioned_handles.filter_map do |mention| mentionable_users.find { |user| user.mentionable_handles.include?(mention) } end end def scan_mentioned_handles mentionable_content.scan(/(?