Разобрать текст, чтобы он соответствовал записям в БД, и преобразовать их в ссылки (Rails 3). - PullRequest
0 голосов
/ 20 декабря 2010

Я ищу способ разбора текста, чтобы превратить в ссылки объекты моего веб-приложения, содержащиеся в тексте. Чтобы было понятно, давайте возьмем этот текст в качестве примера:

Stoner rock and stoner metal are two related sub-genres of hard rock and heavy metal respectively, both combining elements of psychedelic rock, blues-rock, traditional heavy metal and doom metal. The genre emerged during the early 1990s and was pioneered foremost by the Californian bands Kyuss and Sleep.

Я бы хотел связать все жанры, группы и альбомы, которые появляются в тексте (и существуют как сущности в моем веб-приложении), например:

<a href="/genre/1">Stoner rock</a> and stoner metal are two related sub-genres of hard rock and <a href="/genre/2">heavy metal</a> respectively, both combining elements of psychedelic rock, blues-rock, traditional <a href="/genre/2">heavy metal</a> and <a href="/genre/4">doom metal</a>. The genre emerged during the early 1990s and was pioneered foremost by the Californian bands <a href="/band/1">Kyuss</a> and <a href="/band/2">Sleep</a>.

Я думал о разных альтернативах, таких как:

  1. Хранение кода рельсов в базе данных, который будет выводить ссылки (некрасиво и небезопасно),
  2. Выполните полный поиск в базе данных перед вставкой текста и
    а. Найти и преобразовать все мои объекты в ссылки перед сохранением или
    б. Сохраните идентификаторы сущностей в отдельном столбце, поместите теги привязки, а затем в представление, объедините каждый идентификатор сущности с его тегом привязки

Я не очень доволен любой из альтернатив, я думаю, что должен быть разумный способ справиться с этим. Можете ли вы предложить лучший подход? Я использую Ruby On Rails 3.

1 Ответ

0 голосов
/ 21 декабря 2010

Псевдо-кода:

Keywords.find_each do |keyword|
  text.gsub!(keyword, link_to keyword, some_path_for(keyword))
end

В зависимости от того, сколько ключевых слов у вас есть, эта задача может сильно загружать процессор. Подумайте о том, чтобы сначала сохранить текст в БД, и фоновый работник (например, Resque или Delayed :: Job) обрабатывает каждый тест.

Показать исходный (несвязанный) текст, пока он не будет обработан. Я бы предложил использовать два разных поля таблицы для несвязанных и связанных текстов.

...