Я только начал работать на веб-сайте, который поможет людям понять, о чем говорят рэперы. Пользователи будут видеть тексты песни рэпа, и они смогут щелкнуть некоторые тексты, чтобы увидеть объяснение. Вот скриншот (вы также можете проверить сам сайт здесь):
alt text http://img146.imageshack.us/img146/6882/clocal.png
(Оригинальная лирика censored; нажмите здесь, чтобы увидеть их)
В любом случае, мой вопрос заключается в том, как моделировать эти аннотации в моем приложении. Прямо сейчас, я сохраняю текст и аннотации как один большой кадр HTML в этом формате:
<div class="lyrics">
With the goons I spy
<a href="#note1">Stay in tune with ma</a>
<a href="#note2">She like damn
This the realest since 'Kumbaya'</a>
Kumbayay Killa Cam my lord
</div>
<div class="annotations">
<div id="note1">
"Ma" refers to ladies, generally, and specifically also the woman singing the hook; "Stay in tune" is a musical metaphor: he literally stays in tune with the singer and also in the sense that he has game.
</div>
<div id="note2">
Kumbaya is a campfire singalong.
</div>
</div>
а затем обработать его с помощью этого метода для вывода:
class Song < ActiveRecord::Base
include ActionView::Helpers
def annotated_lyrics
lyrics = read_attribute('annotated_lyrics')
return if lyrics.blank?
require 'hpricot'
doc = Hpricot lyrics
doc.at('.lyrics').inner_html = doc.at('.lyrics').inner_html.strip
doc.search("a[@href^='#note']").set('class', 'tooltip').each do |t|
t.inner_html = t.inner_html.strip
end
doc.search("div[@id^='note']").set('class', 'annotation').each do |a|
a.inner_html = auto_link(a.inner_html.strip, :all, :target => '_blank')
end
simple_format doc.html.strip
end
end
а остальное - с jQuery и фантастическим плагином qTip.
Это отлично подходит для отображения, но поскольку мое приложение не знает о взаимосвязи между аннотациями и текстами, будет сложно, скажем, добавить интерфейс для обновления отдельной аннотации inline (или вообще, на самом деле).
С другой стороны, я действительно не знаю, как лучше всего представить это в ActiveRecord. Я полагаю, что песня может иметь "has_many" аннотации, но как я могу представить, какие тексты были аннотированы? Я мог бы хранить индекс начала и конца слова, но это кажется болезненным и чувствительным к незначительным изменениям в текстах.