Ruby / Rails: как заменить строку данными из массива объектов? - PullRequest
3 голосов
/ 30 марта 2011

У меня есть два бита данных, с которыми я здесь работаю.

«Вопрос»: This is an [example] string for [testing] and [what not].

А потом у меня есть массив объектов (называемых «ответы») из моей базы данных:

[#<Answer id: 137, question_id: 207, text: "example">, #<Answer id: 138, question_id: 207, text: "testing">, #<Answer id: 139, question_id: 207, text: "what not"]

Что мне нужно сделать, так это заменить текст вопроса в скобках ([example]) ссылкой, содержащей данные из соответствующего объекта.

Так что [example] может стать <a href="#" data-answer="137" data-question="207">example</a>.

Как я могу это сделать?

Ответы [ 3 ]

6 голосов
/ 30 марта 2011

Если у вас уже есть ответы:

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 теперь изменяется на желаемый результат.

2 голосов
/ 30 марта 2011

Если вы не хотите получать всю таблицу из базы данных, вы можете сначала найти эти строки в скобках, а затем выполнить поиск в базе данных:

str = "This is an [example] string for [testing] and [what not]."
matches =  str.scan(/\[([^\]]*)\]/).collect { |s|s[0]}
Answer.where( :text => matches).each{|o| str.gsub!("[#{o.name}]", "<a href=\"#\" data-answer=\"#{o.id}\" data-question=\"#{o.question_id}\">#{o.name}</a>")}
0 голосов
/ 30 марта 2011
s = "This is an [example] string for [testing] and [what not]"
 => "This is an [example] string for [testing] and [what not]" 
h = {id: 137, question_id: 207, text: "example"}
 => {:id=>137, :question_id=>207, :text=>"example"} 

s.sub(/\[example\]/, %Q{<a href="#" data-answer="#{h[:id]}" data-question="#{h[:question_id]}">#{h[:text]}</a>})
 => "This is an <a href=\"#\" data-answer=\"137\" data-question=\"207\">example</a> string for [testing] and [what not]" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...