【发布时间】:2011-02-08 15:17:56
【问题描述】:
我正在构建一个基于 Sinatra 的应用程序,用于在 Heroku 上进行部署。你可以把它想象成一个标准的 URL 缩短器,但是旧的短代码过期并可以用于新的 URL(我意识到这是一个愚蠢的概念,但这样更容易解释)。我将我的数据库中的简码表示为一个整数,并重新定义它的阅读器以从整数中给出一个漂亮的短且唯一的字符串。
由于某些行将被删除,我编写了遍历所有短代码整数的代码,并选择第一个免费的仅使用before_save。不幸的是,如果我一个接一个地快速运行两个实例,我可以让我的代码创建两行具有相同短代码整数的行,这显然是不好的!我应该如何实现一个锁定系统,以便我可以使用唯一的短代码整数快速保存我的记录?
这是我目前所拥有的:
Chars = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a
CharLength = Chars.length
class Shorts < ActiveRecord::Base
before_save :gen_shortcode
after_save :done_shortcode
def shortcode
i = read_attribute(:shortcode).to_i
return '0' if i == 0
s = ''
while i > 0
s << Chars[i.modulo(CharLength)]
i /= 62
end
s
end
private
def gen_shortcode
shortcode = 0
self.class.find(:all,:order=>"shortcode ASC").each do |s|
if s.read_attribute(:shortcode).to_i != shortcode
# Begin locking?
break
end
shortcode += 1
end
write_attribute(:shortcode,shortcode)
end
def done_shortcode
# End Locking?
end
end
【问题讨论】:
标签: ruby activerecord locking heroku