问题
我正在 Rails 4 中开发一个创意写作应用程序,用户要求提供一项功能,让他们负责每天/每周/每月编写 X 个单词。处理随时间添加的词的跟踪问题的最佳方法是什么?
我目前的解决方案
我为每个用户存储了有限的总字数历史记录,允许我将他们今天所有章节中的总字数与他们昨天、上周或上个月所有章节中的总字数进行比较。
我没有处理的边缘情况(并且不确定如何处理)
如果用户删除大部分章节并重写它或删除整个章节或故事怎么办?我不想惩罚他们扔掉他们之前写的东西。
编辑:
我刚刚修改了 Levenshtein 算法以计算所有添加、删除或替换的单词,以使作者对所有这些活动的写作目标给予肯定。你可以在这里看到代码:
def words_changed_since(second)
first = self.split
second = second.split
matrix = [(0..first.length).to_a]
(1..second.length).each do |j|
matrix << [j] + [0] * (first.length)
end
(1..second.length).each do |i|
(1..first.length).each do |j|
if first[j-1] == second[i-1]
matrix[i][j] = matrix[i-1][j-1]
else
matrix[i][j] = [
matrix[i-1][j],
matrix[i][j-1],
matrix[i-1][j-1],
].min + 1
end
end
end
return matrix.last.last
end
这是在初始化程序中的 String 类上的猴子补丁,以便我可以调用new_chapter_content.words_changed_since old_chapter_content
它只会给我一个正数。我愿意接受有关该算法的反馈,但我现在对此非常满意。我现在最大的问题是:
- 我应该将它存储在我的 postgres 数据库中,还是应该使用像 redis 这样的其他存储?
- 不让每天的单词过期,甚至比每天更频繁地跟踪,比如用户每小时写一次,这会是一个非常糟糕的主意吗?这将使我能够为作家提供非常详细的写作历史,并帮助他们跟踪他们何时最富有成效。