Если у вас уже есть ответы:
str = "This is an [example] string for [testing] and [what not]."
answers.each{|o| str.gsub!("[#{o.name}]", "<a href=\"#\" data-answer=\"#{o.id}\" data-question=\"#{o.question_id}\">#{o.name}</a>")}
Если у вас нет ответов:
str = "This is an [example] string for [testing] and [what not]."
m = str.scan(/\[([^\]]*)\]/).map{|s|s[0]}
Answer.where(:text => m).each{|o| str.gsub!("[#{o.name}]", "<a href=\"#\" data-answer=\"#{o.id}\" data-question=\"#{o.question_id}\">#{o.name}</a>")}
Это работает с помощью регулярного выражения для поиска всего текста в скобках [], который затем возвращает массив в m. Этот массив состоит из ["example", "testing", "what not"].
Затем вы передаете этот массив в вызов where (), в котором внутри SQL используется выражение IN, например WHERE text IN ('example','testing', 'what not')
После запуска str теперь изменяется на желаемый результат.